/// <summary> /// Invoked on TCP client acceptance; reads data from its buffer. /// </summary> /// <param name="ar">Data about the socket.</param> private void AcceptCallback(IAsyncResult ar) { _clientAcceptanceEvent.Set(); if (!_isListening) { return; } var listenerSocket = (Socket)ar.AsyncState; var clientSocket = listenerSocket.EndAccept(ar); Logger.Trace("Client accepted."); var buffer = new byte[ReadBufferSize]; using (var memStream = new MemoryStream()) { int bytesRead; do { bytesRead = clientSocket.Receive(buffer); memStream.Write(buffer, 0, bytesRead); } while (bytesRead > 0); var metadata = new TcpDataProviderMetadata { ReceptionTime = DateTime.UtcNow, SenderAddress = (IPEndPoint)clientSocket.RemoteEndPoint }; _dataProcessor.EnqueueDataToProcess( memStream.ToArray(), metadata, GenerateResponseCallback(clientSocket)); Logger.Trace("Client sent " + memStream.Length + " bytes of data."); } }