Example #1
0
    private void _onReadCallback(IAsyncResult pAsyncResult)
    {
        lock (__lock)
        {
            if (this.IsDisconnected())
            {
                return;
            }

            try
            {
                int numberOfBytesRead = _networkStream.EndRead(pAsyncResult);

                if (numberOfBytesRead == 0)
                {
                    _onConnectError(new Exception("Disconnected by server!"));
                }
                else
                {
                    __nBytesReceived += numberOfBytesRead;
                    /// Test nagle....
                    /// if (__nByteReceived <= 50) return;

                    while (__nBytesReceived >= MsgBase.HEAD_LENGTH)
                    {
                        if (__bIsReceivingHeader)
                        {
                            __bIsReceivingHeader = false;
                            __nMsgLength         = ByteUtils.Byte2Short(__receiveBuffer, 0);

                            if (__nMsgLength == 0)
                            {
                                throw new Exception("Message length is zero!!!");
                            }

                            Debugger.Assert(__nMsgLength <= RECEIVE_BUFFER_SIZE);
                        }

                        if (__nBytesReceived >= __nMsgLength)
                        {
                            _processMessageData();

                            __bIsReceivingHeader = true;

                            /// Copy remain bytes to buffer beginning.
                            ///... Reserves a second buffer to optimize performance!!! (Array.Copy will allocate temp buffer each time if buffer overlapped).
                            int nRemainByteCount = __nBytesReceived - __nMsgLength;
                            Array.Copy(__receiveBuffer, __nMsgLength, __receiveBuffer, 0, nRemainByteCount);
                            __nBytesReceived = nRemainByteCount;

                            __nMsgLength = 0;
                        }
                        else if (__nBytesReceived < __nMsgLength)
                        {
                            break;
                        }
                    }

                    /// Try to read following data
                    _networkStream.BeginRead(__receiveBuffer, __nBytesReceived, RECEIVE_BUFFER_SIZE - __nBytesReceived
                                             , _onReadCallback, 0);
                }
            }
            catch (Exception e)  { _onConnectError(e); }
        }
    }