コード例 #1
0
ファイル: PacketHandler.cs プロジェクト: Najsr/TS3AudioBot
        public S2CPacket FetchPacket()
        {
            while (true)
            {
                if (Closed)
                {
                    return(null);
                }

                if (TryFetchPacket(receiveQueue, out var packet))
                {
                    return(packet);
                }
                if (TryFetchPacket(receiveQueueLow, out packet))
                {
                    return(packet);
                }

                var    dummy = new IPEndPoint(IPAddress.Any, 0);
                byte[] buffer;

                try { buffer = udpClient.Receive(ref dummy); }
                catch (IOException) { return(null); }
                catch (SocketException) { return(null); }

                if (dummy.Address.Equals(remoteAddress.Address) && dummy.Port != remoteAddress.Port)
                {
                    continue;
                }

                packet = Ts3Crypt.GetIncommingPacket(buffer);
                // Invalid packet, ignore
                if (packet == null)
                {
                    LoggerRaw.Debug("Dropping invalid packet: {0}", DebugUtil.DebugToHex(buffer));
                    continue;
                }

                GenerateGenerationId(packet);
                if (!ts3Crypt.Decrypt(packet))
                {
                    continue;
                }

                NetworkStats.LogInPacket(packet);

                switch (packet.PacketType)
                {
                case PacketType.Voice:
                case PacketType.VoiceWhisper:
                    LoggerRawVoice.ConditionalTrace("[I] {0}", packet);
                    break;

                case PacketType.Command:
                    LoggerRaw.Debug("[I] {0}", packet);
                    packet = ReceiveCommand(packet, receiveQueue, PacketType.Ack);
                    break;

                case PacketType.CommandLow:
                    LoggerRaw.Debug("[I] {0}", packet);
                    packet = ReceiveCommand(packet, receiveQueueLow, PacketType.AckLow);
                    break;

                case PacketType.Ping:
                    LoggerRaw.ConditionalTrace("[I] Ping {0}", packet.PacketId);
                    ReceivePing(packet);
                    break;

                case PacketType.Pong:
                    LoggerRaw.ConditionalTrace("[I] Pong {0}", NetUtil.N2Hushort(packet.Data, 0));
                    ReceivePong(packet);
                    break;

                case PacketType.Ack:
                    LoggerRaw.ConditionalDebug("[I] Acking: {0}", NetUtil.N2Hushort(packet.Data, 0));
                    packet = ReceiveAck(packet);
                    break;

                case PacketType.AckLow: break;

                case PacketType.Init1:
                    LoggerRaw.Debug("[I] InitID: {0}", packet.Data[0]);
                    LoggerRaw.Trace("[I] {0}", packet);
                    ReceiveInitAck(packet);
                    break;

                default: throw Util.UnhandledDefault(packet.PacketType);
                }

                if (packet != null)
                {
                    return(packet);
                }
            }
        }
コード例 #2
0
        public IncomingPacket FetchPacket()
        {
            while (true)
            {
                if (Closed)
                {
                    return(null);
                }

                IncomingPacket packet = null;
                if (TryFetchPacket(receiveQueue, out packet))
                {
                    return(packet);
                }
                if (TryFetchPacket(receiveQueueLow, out packet))
                {
                    return(packet);
                }

                var    dummy = new IPEndPoint(IPAddress.Any, 0);
                byte[] buffer;

                try { buffer = udpClient.Receive(ref dummy); }
                catch (IOException) { return(null); }
                catch (SocketException) { return(null); }
                if (dummy.Address.Equals(remoteAddress.Address) && dummy.Port != remoteAddress.Port)
                {
                    continue;
                }

                packet = Ts3Crypt.GetIncommingPacket(buffer);
                if (IsCommandPacketSet(packet))
                {
                    continue;
                }

                if (!ts3Crypt.Decrypt(packet))
                {
                    continue;
                }

                NetworkStats.LogInPacket(packet);

                switch (packet.PacketType)
                {
                case PacketType.Voice: break;

                case PacketType.VoiceWhisper: break;

                case PacketType.Command: packet = ReceiveCommand(packet); break;

                case PacketType.CommandLow: packet = ReceiveCommand(packet); break;

                case PacketType.Ping: ReceivePing(packet); break;

                case PacketType.Pong: ReceivePong(packet); break;

                case PacketType.Ack: packet = ReceiveAck(packet); break;

                case PacketType.AckLow: break;

                case PacketType.Init1: ReceiveInitAck(); break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (packet != null)
                {
                    return(packet);
                }
            }
        }
コード例 #3
0
ファイル: PacketHandler.cs プロジェクト: saibotu/TS3AudioBot
        public IncomingPacket FetchPacket()
        {
            while (true)
            {
                if (Closed)
                {
                    return(null);
                }

                if (TryFetchPacket(receiveQueue, out var packet))
                {
                    return(packet);
                }
                if (TryFetchPacket(receiveQueueLow, out packet))
                {
                    return(packet);
                }

                var    dummy = new IPEndPoint(IPAddress.Any, 0);
                byte[] buffer;

                try { buffer = udpClient.Receive(ref dummy); }
                catch (IOException) { return(null); }
                catch (SocketException) { return(null); }

                if (dummy.Address.Equals(remoteAddress.Address) && dummy.Port != remoteAddress.Port)
                {
                    continue;
                }

                packet = Ts3Crypt.GetIncommingPacket(buffer);
                // Invalid packet, ignore
                if (packet == null)
                {
                    ColorDbg.WritePkgRaw(buffer, "DROPPING");
                    continue;
                }

                GenerateGenerationId(packet);
                if (!ts3Crypt.Decrypt(packet))
                {
                    continue;
                }

                NetworkStats.LogInPacket(packet);

                ColorDbg.WritePkgIn(packet);

                switch (packet.PacketType)
                {
                case PacketType.Voice: break;

                case PacketType.VoiceWhisper: break;

                case PacketType.Command: packet = ReceiveCommand(packet, receiveQueue, PacketType.Ack); break;

                case PacketType.CommandLow: packet = ReceiveCommand(packet, receiveQueueLow, PacketType.AckLow); break;

                case PacketType.Ping: ReceivePing(packet); break;

                case PacketType.Pong: ReceivePong(packet); break;

                case PacketType.Ack: packet = ReceiveAck(packet); break;

                case PacketType.AckLow: break;

                case PacketType.Init1: ReceiveInitAck(); break;

                default: throw Util.UnhandledDefault(packet.PacketType);
                }

                if (packet != null)
                {
                    return(packet);
                }
            }
        }