UDP-трекер не отвечает

Итак, я пытаюсь подключиться к UDP-трекерам с помощью C#, но не получаю ответа. Я также не получаю никаких ошибок. Вот мой код.

namespace UDPTester
{
    class MainClass
    {
        public static bool messageReceived = false;
        public static Random Random = new Random();
        public static void LOG(string format, params object[] args)
        {
            Console.WriteLine (format,args);    
        }
        public static void Main (string[] args)
        {
            LOG ("Creating Packet...");
            byte[] packet;
            using(var stream = new MemoryStream())
            {
                var bc = new MiscUtil.Conversion.BigEndianBitConverter();
                using(var br = new MiscUtil.IO.EndianBinaryWriter(bc,stream))
                {
                    LOG ("Magic Num: {0}",(Int64)0x41727101980);
                    br.Write (0x41727101980);
                    br.Write((Int32)0);
                    br.Write ((Int32)Random.Next());
                    packet = stream.ToArray();
                    LOG ("Packet Size: {0}",packet.Length);
                }
            }
            LOG ("Connecting to tracker...");
            var client = new System.Net.Sockets.UdpClient("tracker.openbittorrent.com",80);
            UdpState s = new UdpState();
            s.e = client.Client.RemoteEndPoint;
            s.u = client;
            StartReceiving(s);

            LOG ("Sending Packet...");
            client.Send(packet,packet.Length);
            while(!messageReceived)
            {
                    Thread.Sleep(1000);
            }
            LOG ("Ended");

        }
        public static void StartReceiving(UdpState state)
        {
            state.u.BeginReceive(ReceiveCallback,state);
        }

        public static void ReceiveCallback(IAsyncResult ar)
        {
            UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
            IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;

            Byte[] receiveBytes = u.EndReceive(ar, ref e);
            string receiveString = Encoding.ASCII.GetString(receiveBytes);

            LOG("Received: {0}", receiveString);
            messageReceived = true;
            StartReceiving((UdpState)ar.AsyncState);
        }

    }
    public class UdpState
    {
        public UdpClient u;
        public EndPoint e;
    }
}

Я использовал обычный BinaryWriter, но это не сработало, и я где-то читал, что ему нужны данные в формате BigEndian.

Это не работает ни для одного из найденных мной трекеров UDP, есть идеи, почему я не получаю ответа? Может быть, они изменили протокол и никому не сказали? Все HTTP-трекеры работают нормально.

Трекеры, которые я пробовал

udp://tracker.publicbt.com:80

udp://tracker.ccc.de:80

udp://tracker.istole.it:80

Кроме того, меня не интересует использование MonoTorrent (и когда я его использовал, UDP все равно не работал).

Источники протоколов

http://xbtt.sourceforge.net/udp_tracker_protocol.html

http://www.rasterbar.com/products/libtorrent/udp_tracker_protocol.html


person Kelly Elton    schedule 02.07.2012    source источник


Ответы (1)


UDP — это протокол без установления соединения, поэтому вы не увидите никаких ошибок, если пакеты будут потеряны или отброшены в пункте назначения.

Попробуйте выполнить следующие шаги диагностики:

  1. Используйте анализатор пакетов (хорошо подойдет Wireshark), чтобы убедиться, что пакеты UDP покидают машину.
  2. Установите какой-нибудь работающий BitTorrent-клиент, проверьте, может ли он связываться с трекером, и если да, используйте анализатор пакетов, чтобы увидеть, чем пакеты, отправленные работающим клиентом, отличаются от пакетов, генерируемых вашим кодом.

Если работающий клиент также не может связаться с трекером, но UDP-трафик уходит с вашей машины, скорее всего, UDP-пакеты отбрасываются брандмауэром. Вы можете попробовать инструмент «traceroute», чтобы диагностировать, куда отбрасываются ваши пакеты (это не всегда на 100% надежно, потому что иногда брандмауэры отбрасывают UDP-пакеты, сгенерированные traceroute, и не отбрасывают обычный UDP-трафик).

person Jan Wrobel    schedule 02.07.2012
comment
Так что, вероятно, дело в брандмауэре ... Я знаю, что Linux и Windows прослушивают порты ниже 1024 или что-то еще без специальных разрешений (здесь используется Linux), поэтому я нахожу это глупым, что они размещают все эти трекеры на 80...это только мое мнение. - person Kelly Elton; 03.07.2012