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 e 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.