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); }
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); }