2011-09-01 35 views
1

顯然,ICMP並不是創建Traceroute的唯一方法。 Thisthis answer表示可以發送低TTL的UDP數據包(或任何其他數據)並等待ICMP消息。如何使用UDP實現Traceroute?

我該如何去實現這個在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()); 
     } 

    } 

回答

1

是,的System.Net.Sockets應該提供所有您需要發送/接收UDP/TCP數據包的原始對象。大量的文檔和在線樣本,您在問題中包含的兩篇文章都非常有趣,並且是一個很好的起點:)