如何使用UDP实现Traceroute?

时间:2011-09-01 20:16:34

标签: c# tcp udp icmp traceroute

显然,ICMP不是创建Traceroute的唯一方法。 Thisthis回答表示可以发送具有低TTL的UDP数据包(或任何其他数据包),并等待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());
        }

    }

2 个答案:

答案 0 :(得分:1)

是的, System.Net.Sockets 应该为您提供发送/接收UDP / TCP数据包所需的所有原始对象。在线提供大量文档和样本,您在问题中包含的两篇文章非常有趣并且是一个很好的起点:)

答案 1 :(得分:0)

https://learningnetwork.cisco.com/thread/87497 您可以在此处查看有关Cisco UPD traceroute实施的详细答案。它相当全面,可以轻松地针对特定的UDP端口。您不会从目标获得UDP数据包。而是,您收到ICMP答复以指示未收到流量。您发出的UDP数据包包含一个随机响应端口号,并且主机跟踪哪些应用程序使用了哪些端口。当ICMP响应被发回时,它被发送到主机IP和UDP标头中包含的响应端口。然后,您的主机将看到该端口,并知道该端口已绑定到您的应用程序。然后,它将数据包传递到您的应用程序。