Griffin.Net.Channels.TcpChannel.OnReadCompleted C# (CSharp) Method

OnReadCompleted() private method

private OnReadCompleted ( object sender, SocketAsyncEventArgs e ) : void
sender object
e System.Net.Sockets.SocketAsyncEventArgs
return void
        private void OnReadCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.BytesTransferred == 0 || e.SocketError != SocketError.Success)
            {
                try
                {
                    _socket.Close();
                }
                catch
                {
                    //close it.
                }
                HandleRemoteDisconnect(e.SocketError, null);
                return;
            }

            if (BufferPreProcessor != null)
            {
                var read = BufferPreProcessor(this, _readArgsWrapper);
                if (read > 0)
                {
                    var newCount = _readArgsWrapper.BytesTransferred - read;
                    var newOffset = _readArgsWrapper.Offset + read;
                    _readArgsWrapper.SetBuffer(newOffset, newCount);
                    _readArgsWrapper.BytesTransferred -= read;
                }
            }

            try
            {
                // pre processor can have read everything
                if (_readArgsWrapper.BytesTransferred > 0)
                    _decoder.ProcessReadBytes(_readArgsWrapper);
            }
            catch (Exception exception)
            {
                ChannelFailure(this, exception);

                // Cleanup before both pending operations have exited.
                try
                {
                    if (!_socket.Connected)
                        return;
                }
                catch (NullReferenceException)
                {
                    //rare case of race condition during cleanup.
                    return;
                }
            }

            ReadAsync();
        }