1

どうやら、Traceroute を作成する方法は ICMP だけではありません。This and this answer は、UDP パケット (またはその他のパケット) を低い TTL で送信し、ICMP メッセージを待つことが可能であることを示しています。

これをC#で実装するにはどうすればよいですか? System.IO.Sockets? TCP オブジェクト? 誰でも簡単/最良の方法を知っていますか?

更新 1:

次のコードは、TTL に到達したときに正しく例外をスローするようです。返された UDP パケットから情報を抽出するにはどうすればよいですか?

受信している UDP パケットが自分宛てのものであること (ホスト上の他のアプリケーションではないこと) を確認するにはどうすればよいですか?

   public  void PingUDPAsync(IPAddress _destination, short ttl)
    {
        // This constructor arbitrarily assigns the local port number.
        UdpClient udpClient = new UdpClient(21000);
        udpClient.Ttl = ttl;
       // udpClient.DontFragment = true;

        try
        {
            udpClient.Connect(_destination, 21000);

            // Sends a message to the host to which you have connected.
            Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");

            udpClient.Send(sendBytes, sendBytes.Length);


            //IPEndPoint object will allow us to read datagrams sent from any source.
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

            // Blocks until a message returns on this socket from a remote host.
            Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
            string returnData = Encoding.ASCII.GetString(receiveBytes);

            // Uses the IPEndPoint object to determine which of these two hosts responded.
            Console.WriteLine("This is the message you received " +
                                         returnData.ToString());
            Console.WriteLine("This message was sent from " +
                                        RemoteIpEndPoint.Address.ToString() +
                                        " on their port number " +
                                        RemoteIpEndPoint.Port.ToString());

            udpClient.Close();
        }
        catch (SocketException socketException)
        {
            Console.WriteLine(socketException.ToString());
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

    }
4

2 に答える 2

1

はい、System.Net.Socketsは、UDP/TCP パケットの送受信に必要なすべてのプリミティブ オブジェクトを提供する必要があります。たくさんのドキュメントとサンプルがオンラインにあります。質問に含めた 2 つの記事は非常に興味深く、良い出発点です :)

于 2011-09-01T20:30:58.097 に答える
0

https://learningnetwork.cisco.com/thread/87497 Cisco の UPD traceroute 実装の詳細については、こちらの回答をご覧ください。これはかなり包括的で、特定の UDP ポートをターゲットにするように簡単に適応できます。ターゲットから UDP パケットが返されません。むしろ、トラフィックが受信されなかったことを示す ICMP 応答を受け取ります。発信したUDPパケットにはランダムな応答ポート番号が含まれており、ホストはどのポートがどのアプリケーションで使用されているかを追跡します。ICMP 応答が返されると、UDP ヘッダーに含まれるホスト IP と応答ポートに送信されます。ホストはポートを確認し、それがアプリケーションにバインドされていることを認識します。次に、パケットをアプリケーションに配信します。

于 2019-02-10T20:10:52.137 に答える