Асинхронный клиент-сервер - C#
Формулировка задачи:
Здравствуйте. Вот уже 3 дня бьюсь над проблемой, решение которой не могу найти. Вообщем, коротко говоря, имеется серверное приложение, которое асинхронно принимает клиентов. Первое, второе подключения проходят нормально, а потом вновь подключенный клиент просто перестает запускаться. Путем точек останова, я вроде как понял что сервер в какой то момент перестает принимать клиентов. Вот вырезки с кода, очень жду помощи, т.к. на этом работа остановилась .
А вот соединение на клиентской части
После этого, запускается метод, который отправляет запрос, и ждет ответа от сервера. Ответ не приходит.
Подскажите, в чем ошибка
// Каждую секунду проверяем подключенных клиентов private static void TimerConnectClient_Tick(object sender) { if (listener.Pending()) { listener.BeginAcceptSocket(new AsyncCallback(OnAccept), listener); } }
// подключился клиент private static void OnAccept(IAsyncResult ar) { Socket client = ((TcpListener)ar.AsyncState).EndAcceptSocket(ar); var EventArgRecive = new SocketAsyncEventArgs(); EventArgRecive.SetBuffer(new byte[SizeBufReciveClient], 0, SizeBufReciveClient); EventArgRecive.AcceptSocket = client; EventArgRecive.Completed += ReciveAsync; if (!client.ReceiveAsync(EventArgRecive)) { ReciveAsync(null, EventArgRecive); } }
// пришло сообщение от клиента private static void ReciveAsync(object sender, SocketAsyncEventArgs e) { string result = System.Text.Encoding.Default.GetString(e.Buffer.Where(x => x != 0).ToArray()); if (result.Trim().Length > 1) { e.SetBuffer(new byte[SizeBufReciveClient], 0, SizeBufReciveClient); case "#1": List<string> listTurbines = new List<string>(turbines.Count); foreach (Turbine t in turbines) if (t.Group.Trim() == Params1) listTurbines.Add(t.GetNameTurbine); SendClient(e.AcceptSocket, listTurbines); break; case "#2": ............................................. } else { SendClient(e.AcceptSocket, "0"); } try { if (!e.AcceptSocket.ReceiveAsync(e)) ReciveAsync(null, e); } catch { } }
/// <summary> /// Проверка соединения с сервером /// </summary> public static System.Net.Sockets.Socket Connect(System.Net.IPAddress ipClient, System.Net.IPAddress ipServer, int port) { var EndPointClient = new System.Net.IPEndPoint(ipClient, port); var EndPointServer = new System.Net.IPEndPoint(ipServer, port); var client = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); client.Bind(EndPointClient); client.Connect(EndPointServer); return client; }
Решение задачи: «Асинхронный клиент-сервер»
textual
Листинг программы
while (true) { AllDone.Reset(); Logger.Act("Ожидается соединение"); listener.BeginAccept(new AsyncCallback(AcceptCallBack), listener); AllDone.WaitOne(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д