Пример #1
0
        public Task WriteResponseMessageAsync([NotNull] IClientConnectionInfo connectionInfo, TcpMessage responseMessage)
        {
            if (connectionInfo == null)
            {
                throw new ArgumentNullException("connectionInfo");
            }
            if (responseMessage == null)
            {
                throw new ArgumentNullException("responseMessage");
            }

            TaskCompletionSource <int> completionSource = new TaskCompletionSource <int>();
            Task headerTask = WriteHeaderAsync(connectionInfo, responseMessage.Header);

            headerTask.ContinueWith(task =>
            {
                SendUserToken userToken = new SendUserToken(SendState.MessageSending, completionSource, this, false);
                this._sender.SendAsync(connectionInfo.Socket, responseMessage.BodyBuffers, responseMessage.Header.Size,
                                       userToken, SendCallbackHandler);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);

            headerTask.ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    completionSource.SetException(task.Exception);
                }
                else
                {
                    completionSource.SetCanceled();
                }
            }, TaskContinuationOptions.NotOnRanToCompletion);

            return(completionSource.Task);
        }
Пример #2
0
        private void startSend(SocketAsyncEventArgs sendArgs, string strData)
        {
            DataPacket dp = new DataPacket();

            dp.Data = strData;

            SendUserToken token = (SendUserToken)sendArgs.UserToken;

            token.DataPacket = dp;

            sendDataPacket(sendArgs);
        }
Пример #3
0
        private void SendCallbackHandler(SendUserToken outerToken, SocketError socketError,
                                         IList <ArraySegment <byte> > buffer)
        {
            // releasing send buffers
            if (outerToken.NeedToReleaseBuffer)
            {
                switch (outerToken.State)
                {
                case SendState.HeaderSending:
                    ReleaseBuffer(this._headerBufferManager, buffer);
                    break;

                case SendState.MessageSending:
                    ReleaseBuffer(this._bodyBufferManager, buffer);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            if (socketError != SocketError.Success)
            {
                outerToken.SendTaskCompletionSource.SetException(new SocketException((int)socketError));
                outerToken.Parent._listener.AcceptAsync(null);
                return;
            }

            switch (outerToken.State)
            {
            case SendState.HeaderSending:
                outerToken.State = SendState.HeaderSent;
                outerToken.SendTaskCompletionSource.SetResult(0);
                break;

            case SendState.MessageSending:
                outerToken.State = SendState.MessageSent;
                outerToken.SendTaskCompletionSource.SetResult(0);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            outerToken.Parent._listener.AcceptAsync(null);
        }
Пример #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);
        }
Пример #5
0
        private void startSend(IDataPacket dpForSend)
        {
            Task.Factory.StartNew(() =>
            {
                lock (((ICollection)_clientCollection).SyncRoot)
                {
                    List <Socket> aSocketsToDelete = new List <Socket>();
                    foreach (Socket client in _clientCollection)
                    {
                        if (client.Connected)
                        {
                            SocketAsyncEventArgs sendArgs;
                            if (!_sendArgsStack.TryPop(out sendArgs))
                            {
                                sendArgs = createSendAsyncEventArgs();
                            }

                            Debug.Assert(sendArgs.UserToken.GetType() == typeof(SendUserToken));
                            sendArgs.AcceptSocket = client;

                            SendUserToken token = (SendUserToken)sendArgs.UserToken;
                            token.DataPacket    = dpForSend;
                            sendDataPacket(sendArgs);
                        }
                        else
                        {
                            aSocketsToDelete.Add(client);
                        }
                    }
                    for (int i = 0; i < aSocketsToDelete.Count; i++)
                    {
                        Socket socket = aSocketsToDelete[i];
                        _clientCollection.Remove(socket);
                    }
                }
            });
        }