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