При подключении второго клиента к серверу возникает ошибка "IAsyncResult не был получен" - C#
Формулировка задачи:
Всем привет, у меня проблема с асинхронными сокетами. Суть:
Пишу простенький чат, написал сервер и клиент. С 1 клиентом работает без ошибок. Подключаю ещё 1 клиент и при отправке сообщения мне вылазит ошибка на сервере что "IAsyncResult не был получен" на строке 99. Что я делаю не так?
Вот код сервера:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Chat
{
public partial class Form1 : Form
{
Socket _serverSocket, _clientSocket;
List<Socket> listSockets= new List<Socket>();
List<string> listNicks = new List<string>();
private byte[] _buffer;
string path= @"C:\Users\haker_000\Documents\visual studio 2012\Projects\Chat\Client\bin\Debug\Client.exe";
private byte[] _buffernick;
bool enable = false;
public Form1()
{
InitializeComponent();
Process.Start(path);
}
private void StartServer()
{
try
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333));
_serverSocket.Listen(0);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
enable = true;
button3.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
}
}
private void AcceptCallback(IAsyncResult ar)
{
try
{
_clientSocket = _serverSocket.EndAccept(ar);
listSockets.Add(_clientSocket);
_buffer = new byte[_clientSocket.ReceiveBufferSize];
_buffernick = new byte[_clientSocket.ReceiveBufferSize];
_clientSocket.BeginReceive(_buffernick, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveNickCallback), null);
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length,SocketFlags.None, new AsyncCallback(ReceiveCallback),null);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
}
}
private void ReceiveNickCallback(IAsyncResult ar)
{
try
{
_clientSocket.EndReceive(ar);
string nick = Encoding.Unicode.GetString(_buffernick);
listNicks.Add(nick);
textBox3.AppendText("\r\n" + nick);
AppendNickToTextBox(nick);
SentToAllClients(nick);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
}
}
private void AppendNickToTextBox(string text)
{
MethodInvoker invoker = new MethodInvoker(delegate
{
textBox2.Text += "\r\n"+ "Welcome " + text;
});
this.Invoke(invoker);
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
int received = _clientSocket.EndReceive(ar);
Array.Resize(ref _buffer, received);
string text = Encoding.Unicode.GetString(_buffer);
AppendToTextBox(text);
Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize);
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
SentToAllClients(text);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
}
}
private void SentToAllClients(string text)
{
byte[] _sendText = Encoding.Unicode.GetBytes(text);
for (int i = 0; i < listSockets.Count; i++)
{
try
{
listSockets[i].BeginSend(_sendText, 0, _sendText.Length, SocketFlags.None, new AsyncCallback(SendnickCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
}
}
}
private void SendnickCallback(IAsyncResult ar)
{
try
{
_clientSocket.EndSend(ar);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void AppendToTextBox(string text)
{
MethodInvoker invoker = new MethodInvoker(delegate
{
textBox2.Text += "\r\n" + text;
});
this.Invoke(invoker);
}
private void button3_Click(object sender, EventArgs e)
{
StartServer();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (enable == true)
{
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
}
}
}
кто-то сможет помочь?
Скажите хотя-бы как сделать из этого мульти-клиентский сервер?
Решение задачи: «При подключении второго клиента к серверу возникает ошибка "IAsyncResult не был получен"»
textual
Листинг программы
lock (_connections)
{
foreach (ConnectionInfo conn in
_connections)
{
if (conn != connection)
{
conn.Socket.Send(buffer, bytesRead,SocketFlags.None);
}
}
}