コード例 #1
0
        private void TryReceive()
        {
            if (!m_Receiving.TryEnter())
            {
                return;
            }

            var receiveAsyncEventArgs = new SocketAsyncEventArgs
            {
                UserToken = new ReceiveContextData(2 * INITIAL_READ_BYTES)
            };

            receiveAsyncEventArgs.Completed += (sender, e) => OnReceiveCompleted(e);

            try
            {
                receiveAsyncEventArgs.PrepareReceiveBuffer(INITIAL_READ_BYTES);
                bool willRaiseEventLater;
                while (!(willRaiseEventLater = ReceiveAsync(receiveAsyncEventArgs)))
                {
                    var canReceive = CompleteReceive(receiveAsyncEventArgs);
                    if (!canReceive)
                    {
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                CloseSocketWhileReceiving(receiveAsyncEventArgs, e);
            }
        }
コード例 #2
0
        private bool CompleteReceive(SocketAsyncEventArgs args)
        {
            if (args.SocketError != SocketError.Success)
            {
                CloseSocketWhileReceiving(args, new SocketException((int)args.SocketError));
                return(false);
            }

            var bytesReceiveRequested = args.Count;

            if (args.BytesTransferred <= 0 && 0 < bytesReceiveRequested)
            {
                CloseSocketWhileReceiving(args);
                return(false);
            }

            var receivedEventData = args.UserToken as ReceiveContextData;

            receivedEventData.ExpandReceiveBuffer(args.BytesTransferred);

            var bytesConsumed = m_OnReceived(receivedEventData.ReceiveBuffer);

            if (bytesConsumed > 0)
            {
                receivedEventData.SkipConsumedData(bytesConsumed);
            }
            else if (bytesConsumed < 0)
            {
                return(false);
            }

            int bytesToReceive;

            if (args.BytesTransferred < bytesReceiveRequested)
            {
                bytesToReceive = INITIAL_READ_BYTES;
            }
            else
            {
                var nextRequestReadBytes = READ_BYTES_INCREASING_RATE * bytesReceiveRequested;
                if (nextRequestReadBytes < 0)
                {
                    nextRequestReadBytes = int.MaxValue;
                }
                bytesToReceive = nextRequestReadBytes;
            }

            args.PrepareReceiveBuffer(bytesToReceive);
            return(true);
        }