private static void ReceiveCallback(IAsyncResult ar) { byte[] Data; ClientManager MyClient = (ClientManager)ar.AsyncState; Socket client = MyClient._socket; if (client == null) { return; } if (!client.Connected) { return; } int BufferSize = getPendingByteCount(client); if (BufferSize > 1000) { return; } try { int BytesReceive = client.EndReceive(ar); if (BytesReceive > 0) { Data = new byte[BytesReceive]; Array.Copy(MyClient.buffer, Data, BytesReceive); ReceiveData.ParsePacket(MyClient, Data); MyClient.buffer = new byte[ClientManager.BufferSize]; // Process received data } else { ClientFunctions.DisconnectClientFromID(MyClient.id); ClientFunctions.RemoveClientFromInstance(MyClient); } client.BeginReceive(MyClient.buffer, 0, ClientManager.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), MyClient); } catch (SocketException e) { if (e.ErrorCode == 10054) { ClientFunctions.DisconnectClientFromID(MyClient.id); ClientFunctions.RemoveClientFromInstance(MyClient); //Console.WriteLine("Client disconnected!"); return; } } catch { ClientFunctions.DisconnectClientFromID(MyClient.id); ClientFunctions.RemoveClientFromInstance(MyClient); //Console.WriteLine("Client disconnected!"); // add to log receive error // remove client connected if is a error: remove from clients list // return; } }