При подключении второго клиента к серверу возникает ошибка "IAsyncResult не был получен" - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет, у меня проблема с асинхронными сокетами. Суть: Пишу простенький чат, написал сервер и клиент. С 1 клиентом работает без ошибок. Подключаю ещё 1 клиент и при отправке сообщения мне вылазит ошибка на сервере что "IAsyncResult не был получен" на строке 99. Что я делаю не так? Вот код сервера:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Net;
  9. using System.Net.Sockets;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace Chat
  14. {
  15. public partial class Form1 : Form
  16. {
  17. Socket _serverSocket, _clientSocket;
  18. List<Socket> listSockets= new List<Socket>();
  19. List<string> listNicks = new List<string>();
  20. private byte[] _buffer;
  21. string path= @"C:\Users\haker_000\Documents\visual studio 2012\Projects\Chat\Client\bin\Debug\Client.exe";
  22. private byte[] _buffernick;
  23. bool enable = false;
  24. public Form1()
  25. {
  26. InitializeComponent();
  27. Process.Start(path);
  28. }
  29.  
  30. private void StartServer()
  31. {
  32. try
  33. {
  34. _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  35. _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333));
  36. _serverSocket.Listen(0);
  37. _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
  38. enable = true;
  39. button3.Enabled = false;
  40. }
  41. catch (Exception ex)
  42. {
  43. MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
  44. }
  45. }
  46. private void AcceptCallback(IAsyncResult ar)
  47. {
  48. try
  49. {
  50. _clientSocket = _serverSocket.EndAccept(ar);
  51. listSockets.Add(_clientSocket);
  52. _buffer = new byte[_clientSocket.ReceiveBufferSize];
  53. _buffernick = new byte[_clientSocket.ReceiveBufferSize];
  54. _clientSocket.BeginReceive(_buffernick, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveNickCallback), null);
  55. _clientSocket.BeginReceive(_buffer, 0, _buffer.Length,SocketFlags.None, new AsyncCallback(ReceiveCallback),null);
  56. }
  57. catch (Exception ex)
  58. {
  59. MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
  60. }
  61. }
  62. private void ReceiveNickCallback(IAsyncResult ar)
  63. {
  64. try
  65. {
  66. _clientSocket.EndReceive(ar);
  67. string nick = Encoding.Unicode.GetString(_buffernick);
  68. listNicks.Add(nick);
  69. textBox3.AppendText("\r\n" + nick);
  70. AppendNickToTextBox(nick);
  71. SentToAllClients(nick);
  72. }
  73. catch (Exception ex)
  74. {
  75. MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
  76. }
  77. }
  78. private void AppendNickToTextBox(string text)
  79. {
  80. MethodInvoker invoker = new MethodInvoker(delegate
  81. {
  82. textBox2.Text += "\r\n"+ "Welcome " + text;
  83. });
  84. this.Invoke(invoker);
  85. }
  86. private void ReceiveCallback(IAsyncResult ar)
  87. {
  88. try
  89. {
  90. int received = _clientSocket.EndReceive(ar);
  91. Array.Resize(ref _buffer, received);
  92. string text = Encoding.Unicode.GetString(_buffer);
  93. AppendToTextBox(text);
  94. Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize);
  95. _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
  96. SentToAllClients(text);
  97. }
  98. catch (Exception ex)
  99. {
  100. MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
  101. }
  102. }
  103. private void SentToAllClients(string text)
  104. {
  105. byte[] _sendText = Encoding.Unicode.GetBytes(text);
  106. for (int i = 0; i < listSockets.Count; i++)
  107. {
  108. try
  109. {
  110. listSockets[i].BeginSend(_sendText, 0, _sendText.Length, SocketFlags.None, new AsyncCallback(SendnickCallback), null);
  111. }
  112. catch (Exception ex)
  113. {
  114. MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK);
  115. }
  116. }
  117. }
  118. private void SendnickCallback(IAsyncResult ar)
  119. {
  120. try
  121. {
  122. _clientSocket.EndSend(ar);
  123. }
  124. catch (Exception ex)
  125. {
  126. MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
  127. }
  128. }
  129. private void AppendToTextBox(string text)
  130. {
  131. MethodInvoker invoker = new MethodInvoker(delegate
  132. {
  133. textBox2.Text += "\r\n" + text;
  134. });
  135. this.Invoke(invoker);
  136. }
  137. private void button3_Click(object sender, EventArgs e)
  138. {
  139. StartServer();
  140. }
  141. private void timer1_Tick(object sender, EventArgs e)
  142. {
  143. if (enable == true)
  144. {
  145. _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
  146. }
  147. }
  148.  
  149. }
  150. }
кто-то сможет помочь?
Скажите хотя-бы как сделать из этого мульти-клиентский сервер?

Решение задачи: «При подключении второго клиента к серверу возникает ошибка "IAsyncResult не был получен"»

textual
Листинг программы
  1.  lock (_connections)
  2.                         {
  3.                             foreach (ConnectionInfo conn in
  4.                                 _connections)
  5.                             {
  6.                                 if (conn != connection)
  7.                                 {
  8.                                     conn.Socket.Send(buffer, bytesRead,SocketFlags.None);
  9.                                    
  10.                                 }
  11.                                
  12.                             }
  13.                         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы