1

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

4

1 に答える 1

1

UDP はコネクションレス プロトコルであるため、宛先でパケットが失われたりドロップされたりしても、エラーは表示されません。

次の診断手順を試してください。

  1. パケット スニファー (Wireshark が適しています) を使用して、UDP パケットがマシンから出ていることを確認します。
  2. 動作中の BitTorrent クライアントをインストールし、トラッカーと通信できるかどうかを確認します。通信できる場合は、パケット スニファーを使用して、動作中のクライアントから送信されたパケットがコードが生成するパケットとどのように異なるかを確認します。

動作しているクライアントもトラッカーと通信できないが、UDP トラフィックがマシンから出ている場合、UDP パケットはファイアウォールによってドロップされている可能性があります。「traceroute」ツールを試して、パケットがドロップされた場所を診断できます (ファイアウォールが traceroute によって生成された UDP パケットをドロップし、通常の UDP トラフィックをドロップしない場合があるため、これは常に 100% 信頼できるとは限りません)。

于 2012-07-02T21:13:47.587 に答える