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