private void ProcessBody(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); messageStream.Flush(); long remaining = readBytes.Length - byteRead; if (remaining > 0) { ReadBuffer(remaining, BODY); } else if (remaining == 0) { messageStream.Position = 4; try { var mail = formatter.Deserialize <Mail>(messageStream); messageStream.Close(); messageStream = new MemoryStream(); pool.ReceiveMail(mail); } catch (Exception e) { pool.RemoveSocket(this); pool.MessageError(this, e); } ReadBuffer(4, HEADER); } } catch (Exception e) { pool.RemoveSocket(this); pool.NetworkException(e); } } }