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(); } } }
public virtual bool OnPacketArrived(PacketType pkt) { if (PacketArrived == null) { return(true); } bool continueProcessing = true; Delegate[] pktHandlers = PacketArrived.GetInvocationList(); if (pktHandlers.Length > 0) { object[] args = new object[] { this, pkt }; ILinkMark mark = CreateMark(); try { foreach (Delegate d in pktHandlers) { try { continueProcessing = (bool)d.DynamicInvoke(args); } catch (Exception) { // Don't want an exception thrown by a PacketHandler method to // prevent all handlers from being notified. } ClearError(); SeekMark(mark); if (!continueProcessing) { break; } } } finally { DestroyMark(mark); } } return(continueProcessing); }
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); } }