При подключении второго клиента к серверу возникает ошибка "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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д