Documents & code‎ > ‎

IP-tracert (2)

Трассировка [2] 

Так, на всякий случай для упрощения задачи: 
При работе с пингом в Framework 2 и старше [Ping Class] в синхронном режиме [synchronously] получить можно только кол-во прыжков, а вот при асинхронном SendAsync [asynchronously] очень даже просто. 




Private hop As Integer = Nothing 

Public Sub Callback(ByVal sender As Object, ByVal e As PingCompletedEventArgs) 
      ' 
      If (Not e.Reply Is Nothing) _ 
      And (e.Reply.Status = IPStatus.TtlExpired) _ 
      Or (e.Reply.Status = IPStatus.Success) Then 
      ' 
      Try 
       ' 
       Console.WriteLine(String.Concat("..." _ 
            , Dns.Resolve(e.Reply.Address.ToString).HostName _ 
            , " [", e.Reply.Address, "]") _ 
            ) 
       ' 
       If e.Reply.Status = IPStatus.Success Then 
            hop = 16 
       End If 
       ' 
      Catch ex As Exception 
      End Try 
      ' 
      End If 
      ' 
      CType(e.UserState, AutoResetEvent).[Set]() 
      ' 
End Sub 

<STAThread()Sub Main() 
      ' 
      For hop = 1 To 16 
      ' 
      Try 
       ' 
       Dim AutoReset As New AutoResetEvent(False) 
       Dim client As New Ping 
       AddHandler client.PingCompleted, New PingCompletedEventHandler(AddressOf Callback) 
       Dim options As New PingOptions(hop, True) 
       client.SendAsync("81.19.70.3", 12000 _ 
            , Encoding.ASCII.GetBytes("AAAA") _ 
            , options, AutoReset) 
       AutoReset.WaitOne() 
       ' 
      Catch As Exception 
       Console.WriteLine(String.Concat( _ 
       e.Message _ 
       )) 
      End Try 
      ' 
      Next 
      ' 
      Console.WriteLine(String.Concat(ControlChars.CrLf _ 
      , "Press ENTER to continue..." _ 
      )) 
      ' 
      Console.ReadLine() 
      ' 
End Sub 



так же можно воспользоваться [Iphlpapi.dll], а именно её двумя функциями: 

a. GetRTTAndHopCount. 
b. IcmpSendEcho2. 
Comments