UDP Tracker没有响应

时间:2012-07-02 20:30:54

标签: c# udp bittorrent

好吧,我正在尝试使用c#连接到UDP跟踪器,但我从来没有得到过响应。我也没有任何错误。这是我的代码。

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

1 个答案:

答案 0 :(得分:1)

UDP是一种无连接协议,因此如果数据包在目的地丢失或丢失,您将不会看到任何错误。

尝试以下诊断步骤:

  1. 使用数据包嗅探器(Wireshark是一个很好的数据包)来检查UDP数据包是否正在离开机器。
  2. 安装一些正在运行的BitTorrent客户端,检查它是否可以与跟踪器通信,如果是,请使用数据包嗅探器查看工作客户端发送的数据包与代码生成的数据包的不同。
  3. 如果工作客户端也无法与跟踪器通信,但UDP流量正在离开您的计算机,则UDP数据包可能会被防火墙丢弃。您可以尝试跟踪路由'用于诊断数据包丢弃位置的工具(这并非总是100%可靠,因为有时防火墙会丢弃由traceroute生成的UDP数据包,并且不会丢弃正常的UDP流量。)