Пример #1
0
 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));
     }
 }
Пример #2
0
        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));
            }
        }