Exemplo n.º 1
0
        public static RUDPInternalPacket Deserialize(byte[] header, byte[] data)
        {
            RUDPInternalPacket p  = new RUDPInternalPacket();
            MemoryStream       ms = new MemoryStream(data);

            using (BinaryReader br = new BinaryReader(ms))
            {
                br.ReadBytes(header.Length);
                p.Channel   = br.ReadInt32();
                p.Type      = (RUDPInternalPacketType)br.ReadByte();
                p.Data      = br.ReadInt32();
                p.ExtraData = br.ReadString();
            }
            return(p);
        }
Exemplo n.º 2
0
        private void ProcessChannelData(IPEndPoint ep, byte[] data, int length)
        {
            RUDPPacket         p;
            RUDPChannel        channel;
            RUDPInternalPacket ip;
            DateTime           dtNow = DateTime.Now;

            Trace("RECV: {0}", Encoding.ASCII.GetString(data));

            string strEp            = ep.ToString();
            bool   isNormalPacket   = length >= PacketHeader.Length && data.Take(PacketHeader.Length).SequenceEqual(PacketHeader);
            bool   isInternalPacket = length >= PacketHeaderInternal.Length && data.Take(PacketHeaderInternal.Length).SequenceEqual(PacketHeaderInternal);

            if (isInternalPacket)
            {
                ip = RUDPInternalPacket.Deserialize(PacketHeaderInternal, data);
                Trace("INTERNAL RECV <- {0}: {1}", ep, ip);

                if (ip.Channel == 0)
                {
                    switch (ip.Type)
                    {
                    case RUDPInternalPacket.RUDPInternalPacketType.CHANNELREQUEST:
                        string channelName = ip.ExtraData;
                        int    channelId   = RequestFreeChannel(ep, channelName);
                        Trace("Assigning channel {0} as {1}", channelId, channelName);
                        ip = new RUDPInternalPacket()
                        {
                            Type = RUDPInternalPacket.RUDPInternalPacketType.CHANNELASSIGN, Channel = 0, Data = channelId, ExtraData = channelName
                        };
                        _socket.SendBytes(ep, ip.Serialize(PacketHeaderInternal));
                        break;

                    case RUDPInternalPacket.RUDPInternalPacketType.CHANNELASSIGN:
                        if (!_channels.ContainsKey(strEp))
                        {
                            _channels[strEp] = new List <RUDPChannel>();
                        }
                        Trace("Channel {0} assigned as {1}", ip.ExtraData, ip.Data);
                        RUDPChannel c = new RUDPChannel()
                        {
                            Connection = this,
                            Id         = ip.Data,
                            Name       = ip.ExtraData,
                            IsServer   = false,
                            EndPoint   = ep
                        }.Init();
                        _channels[strEp].Add(c);
                        OnChannelAssigned?.Invoke(c);
                        break;

                    case RUDPInternalPacket.RUDPInternalPacketType.PING:
                        channel = _channels[strEp].Where(x => x.Id == ip.Channel).SingleOrDefault();
                        if (!(channel == null || channel.State >= State.CLOSING))
                        {
                            if (ip.Data == 0)
                            {
                                _socket.SendBytes(ep, new RUDPInternalPacket()
                                {
                                    Type = RUDPInternalPacket.RUDPInternalPacketType.PING, Channel = channel.Id, Data = 1
                                }.Serialize(PacketHeaderInternal));
                            }
                            channel.LastKeepAliveReceived = DateTime.Now;
                        }
                        break;
                    }
                }
                else
                {
                    channel = _channels[strEp].Where(x => x.Id == ip.Channel).SingleOrDefault();
                    if (channel == null || channel.State >= State.CLOSING)
                    {
                        Trace("Channel {0} not found for {1} or channel is CLOSING", ip.Channel, strEp);
                        return;
                    }

                    switch (ip.Type)
                    {
                    case RUDPInternalPacket.RUDPInternalPacketType.ACK:
                        channel.LastKeepAliveReceived = DateTime.Now;
                        channel.AcknowledgePacket(ip.Data);
                        break;
                    }
                }
            }
            else if (isNormalPacket)
            {
                p       = Serializer.Deserialize(PacketHeader, data);
                channel = _channels[strEp].Where(x => x.Id == p.Channel).SingleOrDefault();
                if (channel != null)
                {
                    p.Src        = ep;
                    p.Serializer = Serializer;
                    Trace("ADDRECV: {0}", p);
                    channel.AddReceivedPacket(p);
                    channel.LastKeepAliveReceived = DateTime.Now;
                    ip = new RUDPInternalPacket()
                    {
                        Type = RUDPInternalPacket.RUDPInternalPacketType.ACK, Channel = p.Channel, Data = p.Seq
                    };
                    Trace("INTERNAL SEND -> {0}: {1}", ep, ip);
                    _socket.SendBytes(ep, ip.Serialize(PacketHeaderInternal));
                }
                else
                {
                    Trace("Unknown channel {0} for {1}", p.Channel, p);
                }
            }
        }