private void ProcessHeader(IAsyncResult ar) { if (Connected) { try { int byteRead = socket.EndReceive(ar); if (byteRead == 0) { pool.RemoveSocket(this); pool.NetworkClose(); return; } var readBytes = (byte[])ar.AsyncState; messageStream.Write(readBytes, 0, byteRead); long remaining = 4 - messageStream.Length; if (remaining > 0) { ReadBuffer(remaining, HEADER); } else { messageStream.Position = 0; int mailSize = ReadInt(messageStream); ReadBuffer(mailSize, BODY); expectingBodyLen = mailSize; } } catch (Exception e) { pool.RemoveSocket(this); pool.NetworkException(e); } } }