public override void PacketReceive(IPEndPoint ep, byte[] data, int length) { base.PacketReceive(ep, data, length); if (length > _packetHeader.Length && data.Take(_packetHeader.Length).SequenceEqual(_packetHeader)) { RUDPPacket p = RUDPPacket.Deserialize(_packetHeader, data); p.Src = IsServer ? ep : RemoteEndPoint; p.Received = DateTime.Now; InitSequence(p.Src); RUDPConnectionData sq = _sequences[p.Src.ToString()]; Send(p.Src, new RUDPInternalPacket.ACKPacket() { header = _internalHeader, sequence = p.Seq }.Serialize()); Debug("ACK SEND -> {0}: {1}", p.Src, p.Seq); lock (sq.ReceivedPackets) sq.ReceivedPackets.Add(p); } else if (length > _internalHeader.Length && data.Take(_internalHeader.Length).SequenceEqual(_internalHeader)) { IPEndPoint src = IsServer ? ep : RemoteEndPoint; InitSequence(src); RUDPConnectionData sq = _sequences[src.ToString()]; RUDPInternalPacket.ACKPacket ack = RUDPInternalPacket.ACKPacket.Deserialize(data); Debug("ACK RECV <- {0}: {1}", src, ack.sequence); lock (sq.Pending) sq.Pending.RemoveAll(x => x.Seq == ack.sequence); } else { Console.WriteLine("[{0}] RAW RECV: [{1}]", GetType().ToString(), Encoding.ASCII.GetString(data, 0, length)); } }
public override void PacketReceive(IPEndPoint ep, byte[] data, int length) { base.PacketReceive(ep, data, length); DateTime dtNow = DateTime.Now; IPEndPoint src = IsServer ? ep : RemoteEndPoint; if (length >= PacketHeader.Length && data.Take(PacketHeader.Length).SequenceEqual(PacketHeader)) { RUDPPacket p = RUDPPacket.Deserialize(_serializer, PacketHeader, data); RUDPConnectionData cn = GetConnection(src); cn.LastPacketDate = dtNow; p.Src = src; p.Serializer = _serializer; p.Received = dtNow; lock (cn.ReceivedPackets) cn.ReceivedPackets.Add(p); SendBytes(p.Src, new RUDPInternalPackets.AckPacket() { header = AckPacketHeader, sequence = p.Seq }.Serialize()); //Debug("ACK SEND -> {0}: {1}", p.Src, p.Seq); SignalPacketRecv.Set(); } else if (length >= AckPacketHeader.Length && data.Take(AckPacketHeader.Length).SequenceEqual(AckPacketHeader)) { RUDPConnectionData cn = GetConnection(src); cn.LastPacketDate = dtNow; RUDPInternalPackets.AckPacket ack = RUDPInternalPackets.AckPacket.Deserialize(data); //Debug("ACK RECV <- {0}: {1}", src, ack.sequence); lock (cn.Pending) cn.Pending.RemoveAll(x => x.Seq == ack.sequence); } else if (length >= PingPacketHeader.Length && data.Take(PingPacketHeader.Length).SequenceEqual(PingPacketHeader)) { RUDPConnectionData cn = GetConnection(src); cn.LastPacketDate = dtNow; RUDPInternalPackets.PingPacket ping = RUDPInternalPackets.PingPacket.Deserialize(data); Debug("<- PING FROM {0}", src); } else { Console.WriteLine("[{0}] RAW RECV: [{1}]", GetType().ToString(), Encoding.ASCII.GetString(data, 0, length)); } }