private void ReceiveCallback(IAsyncResult ar) { var state = (StateObject)ar.AsyncState; Socket handler = state.WorkSocket; int bytesRead = 0; try { bytesRead = handler.EndReceive(ar); } catch (Exception e) { server.CheckIfClientDisconnected(handler); return; } if (bytesRead > 2) { try { foreach (var message in MessageSerializer.UnwrapMessages(state.Buffer, bytesRead)) { var receivedMessage = new ReceivedMessage(handler, message); server.AddMessage(receivedMessage); } } catch (ArgumentOutOfRangeException e) { logger.Warn("[NetworkComponent] {message}", e.Message); } state.SetReceiveCallback(new AsyncCallback(ReceiveCallback)); } else if (bytesRead > 0) { logger.Warn("[NetworkComponent] Received message was too short (expected more than 2 bytes)"); state.SetReceiveCallback(new AsyncCallback(ReceiveCallback)); } else if (!server.CheckIfClientDisconnected(handler)) { state.SetReceiveCallback(new AsyncCallback(ReceiveCallback)); } }
// Call this method from other threads internal void AddMessage(ReceivedMessage receivedMessage) { messageQueue.Enqueue(receivedMessage); shouldProcessMessage.Set(); }