コード例 #1
0
        private bool ResendPackages(IEnumerable <OutgoingPacket> packetList, ref TimeSpan sleepSpan)
        {
            TimeSpan maxTimeout = GetTimeout(PacketTimeouts.Length);

            foreach (var outgoingPacket in packetList)
            {
                var nextTest = (outgoingPacket.LastSendTime - Util.Now) + GetTimeout(outgoingPacket.ResendCount);
                if (nextTest < TimeSpan.Zero)
                {
                    if (++outgoingPacket.ResendCount > RetryTimeout)
                    {
#if DEBUG
                        Console.WriteLine("TIMEOUT: " + DebugUtil.DebugToHex(outgoingPacket.Raw));
#endif
                        return(true);
                    }
                    SendRaw(outgoingPacket);
                }
                else
                {
                    sleepSpan = Util.Min(sleepSpan, nextTest);
                }
            }
            return(false);
        }
コード例 #2
0
ファイル: PacketHandler.cs プロジェクト: sertsch1/TS3AudioBot
 private void SendRaw(C2SPacket packet)
 {
     packet.LastSendTime = Util.Now;
     NetworkStats.LogOutPacket(packet);
     LoggerRaw.Trace("[O] Raw: {0}", DebugUtil.DebugToHex(packet.Raw));
     udpClient.Send(packet.Raw, packet.Raw.Length);
 }
コード例 #3
0
        private bool ResendPackages(IEnumerable <OutgoingPacket> packetList)
        {
            var now = Util.Now;

            foreach (var outgoingPacket in packetList)
            {
                // Check if the packet timed out completely
                if (outgoingPacket.FirstSendTime < now - PacketTimeout)
                {
#if DIAGNOSTICS && DIAG_TIMEOUT
                    Console.WriteLine("TIMEOUT: " + DebugUtil.DebugToHex(outgoingPacket.Raw));
#endif
                    return(true);
                }

                // Check if we should retransmit a packet because it probably got lost
                if (outgoingPacket.LastSendTime < now - currentRto)
                {
#if DIAGNOSTICS && DIAG_TIMEOUT
                    Console.WriteLine("RESEND PACKET: " + DebugUtil.DebugToHex(outgoingPacket.Raw));
#endif
                    currentRto = currentRto + currentRto;
                    if (currentRto > MaxRetryInterval)
                    {
                        currentRto = MaxRetryInterval;
                    }
                    SendRaw(outgoingPacket);
                }
            }
            return(false);
        }
コード例 #4
0
ファイル: BasePacket.cs プロジェクト: GAMEBOOK/TS3AudioBot
 public override string ToString()
 {
     return($"Type: {PacketType}\tFlags: [ " +
            $"{(FragmentedFlag ? "X" : "_")} {(NewProtocolFlag ? "X" : "_")} " +
            $"{(CompressedFlag ? "X" : "_")} {(UnencryptedFlag ? "X" : "_")} ]\t" +
            $"Id: {PacketId}\n" +
            $"  Data: { DebugUtil.DebugToHex(Data) }\n" +
            $"  ASCI: { Util.Encoder.GetString(Data) }");
 }
コード例 #5
0
ファイル: PacketHandler.cs プロジェクト: sertsch1/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); }
                catch (ObjectDisposedException) { return(null); }

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

                packet = Ts3Crypt.GetS2CPacket(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.Trace("[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.Trace("[I] Ping {0}", packet.PacketId);
                    ReceivePing(packet);
                    break;

                case PacketType.Pong:
                    LoggerRaw.Trace("[I] Pong {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));
                    ReceivePong(packet);
                    break;

                case PacketType.Ack:
                    LoggerRaw.Debug("[I] Acking: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));
                    packet = ReceiveAck(packet);
                    break;

                case PacketType.AckLow: break;

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

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

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