Example #1
0
        private void RecieveCallbackHandler(RecieveUserToken outerToken, SocketError socketError,
                                            IList <ArraySegment <byte> > buffer)
        {
            if (socketError != SocketError.Success)
            {
                outerToken.RecieveTaskCompletionSource.SetException(new SocketException((int)socketError));
                outerToken.Parent._listener.AcceptAsync(null);
                return;
            }

            switch (outerToken.State)
            {
            case RecieveState.HeaderRecieving:
                //TODO make override for Read method to get IList<ArraySegment<byte>>
                TcpMessageHeader header = TcpMessageHeader.Read(buffer[0].Array, buffer[0].Offset);
                this._headerReciever.ReleaseCallbackBuffer(buffer);

                outerToken.RecievedHeader = header;
                outerToken.State          = RecieveState.BodyRecieving;
                this._bodyReciever.RecieveAsync(outerToken.Socket, header.Size, outerToken, RecieveCallbackHandler);
                break;

            case RecieveState.BodyRecieving:
                TcpMessage message = TcpMessage.CreateMessage(outerToken.RecievedHeader, buffer, this._bodyBufferManager);

                outerToken.State = RecieveState.BodyRecieved;
                outerToken.RecieveTaskCompletionSource.SetResult(message);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            outerToken.Parent._listener.AcceptAsync(null);
        }
Example #2
0
        public async Task <TcpMessage> ReadAsync([NotNull] IClientConnectionInfo connectionInfo)
        {
            if (connectionInfo == null)
            {
                throw new ArgumentNullException("connectionInfo");
            }

            byte[] headerBuffer = ReadBytes(connectionInfo.Stream, TcpMessageHeader.HeaderSize, this._сonfiguration.HeaderReadingTimeout);
            if (headerBuffer == null)
            {
                // no buffer to read
                return(null);
            }

            TcpMessageHeader tcpMessageHeader = TcpMessageHeader.Read(headerBuffer);
            int maxMessageBodySize            = this._сonfiguration.GetMaxMessageBodySize(tcpMessageHeader.Command);

            if (tcpMessageHeader.Size > maxMessageBodySize)
            {
                Debug.WriteLine("Message body size limit exceed. Size: {0}, Limit: {1}", tcpMessageHeader.Size, maxMessageBodySize);
                return(null);
            }

            using (BufferWriteStream stream = new BufferWriteStream(this._bodyBufferManager))
            {
                try
                {
                    TimeSpan bodyReceivingTimeout = this._сonfiguration.GetMessageRecieveTimeout(tcpMessageHeader.Command);
                    int      readBytesCount       = connectionInfo.Stream.BufferedCopyTo(stream, tcpMessageHeader.Size, bodyReceivingTimeout);
                    if (readBytesCount != tcpMessageHeader.Size)
                    {
                        Debug.WriteLine("Message body not recieved completely. Recieved: {0}, expected: {1} bytes", readBytesCount, tcpMessageHeader.Size);
                        this._bodyBufferManager.CheckIn(stream.Buffers);
                        return(null);
                    }
                    return(TcpMessage.CreateMessage(tcpMessageHeader, stream.Buffers, this._bodyBufferManager));
                }
                catch (Exception)
                {
                    this._bodyBufferManager.CheckIn(stream.Buffers);
                    throw;
                }
            }
        }
Example #3
0
        public async Task WriteResponseStreamAsync([NotNull] IClientConnectionInfo connectionInfo,
                                                   [NotNull] TcpMessageHeader header, [NotNull] Stream input)
        {
            if (connectionInfo == null)
            {
                throw new ArgumentNullException("connectionInfo");
            }
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }

            WriteHeaderAsync(connectionInfo, header);
            await input.CopyToAsync(connectionInfo.Stream);
        }
Example #4
0
        private Task WriteHeaderAsync([NotNull] IClientConnectionInfo connectionInfo, [NotNull] TcpMessageHeader header)
        {
            if (connectionInfo == null)
            {
                throw new ArgumentNullException("connectionInfo");
            }
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }

            TaskCompletionSource <int>   completionSource = new TaskCompletionSource <int>();
            IList <ArraySegment <byte> > headerBuffer     = this._headerBufferManager.CheckOut(TcpMessageHeader.HeaderSize);

            Debug.Assert(headerBuffer.Count == 1);
            // TODO Write header to  IList<ArraySegment<byte>>
            header.Write(headerBuffer[0].Array, headerBuffer[0].Offset);
            SendUserToken userToken = new SendUserToken(SendState.HeaderSending, completionSource, this, true);

            this._sender.SendAsync(connectionInfo.Socket, headerBuffer, TcpMessageHeader.HeaderSize, userToken, SendCallbackHandler);

            return(userToken.SendTaskCompletionSource.Task);
        }
Example #5
0
 /// <summary>
 /// Посылка заголовка и потока.
 /// </summary>
 public async Task WriteStreamDataAsync(TcpMessageHeader header, Stream input)
 {
     await MessageTransport.WriteResponseStreamAsync(this._connectionInfo, header, input);
 }
Example #6
0
        private void WriteHeaderAsync([NotNull] IClientConnectionInfo connectionInfo, [NotNull] TcpMessageHeader header)
        {
            if (connectionInfo == null)
            {
                throw new ArgumentNullException("connectionInfo");
            }
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }

            byte[] responseBuffer = new byte[TcpMessageHeader.HeaderSize];
            header.Write(responseBuffer);
            connectionInfo.Stream.Write(responseBuffer, 0, responseBuffer.Length);
        }