Пример #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);
        }
Пример #2
0
        public Task <TcpMessage> ReadAsync([NotNull] IClientConnectionInfo connectionInfo)
        {
            TaskCompletionSource <TcpMessage> completionSource = new TaskCompletionSource <TcpMessage>();
            RecieveUserToken userToken = new RecieveUserToken(connectionInfo.Socket, RecieveState.HeaderRecieving, completionSource, this);

            this._headerReciever.RecieveAsync(connectionInfo.Socket, TcpMessageHeader.HeaderSize, userToken, RecieveCallbackHandler);

            return(completionSource.Task);
        }