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