internal void TakeNewBuffer()
        {
            // Take a new buffer from our pool of buffers or
            // create a new buffer if we don't have any.
            _buf = _settings.GetBuffer();
            _buffers.Push(_buf);

            // Reset the pointer in the current in buffer.
            _ptr = 0;
            _bufIndex++;

            Debug.WriteLine("Took new buffer from NetworkManagerAsync. {0}", args: _bufIndex);
        }
예제 #2
0
        private void ProcessReceive(SocketAsyncEventArgs args)
        {
#if VERBOSE
            Debug.WriteLine("Processing receive on {0}.", args: _ident);
#endif
            Debug.Assert(args != null);
            Debug.Assert(args.Buffer != null);
            Debug.Assert(args.LastOperation == SocketAsyncOperation.Receive);
            Debug.Assert(args.Count <= _settings.BufferSize);
            Debug.Assert(args.Buffer.Length == _settings.BufferSize);

            // If we've filled the buffer completely
            // we take a new buffer and write to that new buffer instead.
            if (args.BytesTransferred == args.Count)
            {
                // Take a new buffer from the NetworkManagerAsyncSettings.
                var newBuffer = _settings.GetBuffer();
                _usedIncomingBuffers.Push(newBuffer);

                // Set the SocketAsyncEventArgs to write directly
                // into the stream buffer.
                args.SetBuffer(newBuffer, 0, _settings.BufferSize);
            }
            else
            {
                // Set the SocketAsyncEventArgs to append to the
                // the current buffer instead of overwriting.

                // Move the write(offset) pointer of the args to continue
                // appending to the buffer.
                var offset = args.BytesTransferred;
                var count  = _settings.BufferSize - offset;

                args.SetBuffer(offset, count);
            }

            // Keep track of how much data with appended to the incoming buffer.
            _incomingBuffer._len += args.BytesTransferred;

            // Try to process new messages.
            var messageArgs = default(MessageReceivedEventArgs);
            do
            {
                // Get next incoming message from the buffers.
                // Returns null if we don't have enough data usually.
                messageArgs = ProcessNextIncomingMessage();
#if VERBOSE
                if (messageArgs != null)
                {
                    if (messageArgs.Message != null)
                    {
                        Debug.WriteLine("MessageProcessor processed {0}", args: messageArgs.Message.GetType().Name);
                    }
                    else
                    {
                        Debug.WriteLine("MessageProcessor returned null.");
                    }
                }
#endif

                // Raise the event handler and let the user handle the message.
                if (messageArgs != null)
                {
                    OnMessageReceived(messageArgs);
                }
            } while (messageArgs != null);

            // Start receiving more after we're done processing the messages on
            // the incoming buffer.
            StartReceive(args);
        }