Пример #1
0
        /// <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.");
            }
        }