private void SocketReadCompleted(AsyncResultEventArgs <int> args) { if (args.Error != null) { if (PacketArrived != null) { PacketArrived.Invoke(new AsyncResultEventArgs <byte[]>(args.Error)); } return; } _bytesReceived += args.Result; if (args.Result == 0) { if (PacketArrived != null) { PacketArrived.Invoke(new AsyncResultEventArgs <byte[]>(null as byte[])); } return; } if (_dataBuffer == null) { if (_bytesReceived != Protocol.Reader.LengthBytes) { ContinueReading(); } else { int length = Protocol.Reader.ParseLength(_lengthBuffer); _dataBuffer = new byte[length]; _bytesReceived = 0; ContinueReading(); } } else { if (_bytesReceived != _dataBuffer.Length) { ContinueReading(); } else { if (PacketArrived != null) { PacketArrived.Invoke(new AsyncResultEventArgs <byte[]>(_dataBuffer)); } _dataBuffer = null; _bytesReceived = 0; ContinueReading(); } } }
private void Socket_ReadCompleted(object sender, TcpCompletedEventArgs e) { if (!e.Error) { bytesReceived += (int)e.Data; if ((int)e.Data == 0) { PacketArrived?.Invoke(Socket, new TcpCompletedEventArgs()); return; } if (dataBuffer == null) { if (bytesReceived != sizeof(int)) { ReadLoop(); } else { int len = BitConverter.ToInt32(lenghtBuffer, 0); if (len < 0) { PacketArrived?.Invoke(Socket, new TcpCompletedEventArgs { Data = new System.IO.InvalidDataException( "Packet length less than zero (corrupted message)"), Error = true }); return; } // Keepalive packet if (len == 0) { bytesReceived = 0; ReadLoop(); } else { dataBuffer = new byte[len]; bytesReceived = 0; ReadLoop(); } } } else { if (bytesReceived != dataBuffer.Length) { // Keep reading data ReadLoop(); } else { PacketArrived?.Invoke(Socket, new TcpCompletedEventArgs(dataBuffer)); dataBuffer = null; bytesReceived = 0; ReadLoop(); } } } else { PacketArrived?.Invoke(Socket, e); } }