TraceRoute and Ping in C#

后端 未结 6 726
我在风中等你
我在风中等你 2020-11-27 14:25

Does anyone have C# code handy for doing a ping and traceroute to a target computer? I am looking for a pure code solution, not what I\'m doing now, which is invoking the p

6条回答
  •  执念已碎
    2020-11-27 15:27

    Given that I had to write a TraceRoute class today I figured I might as well share the source code.

    using System.Collections.Generic;
    using System.Net.NetworkInformation;
    using System.Text;
    using System.Net;
    
    namespace Answer
    {  
      public class TraceRoute
      {
        private const string Data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    
        public static IEnumerable GetTraceRoute(string hostNameOrAddress)
        {
          return GetTraceRoute(hostNameOrAddress, 1);
        }
        private static IEnumerable GetTraceRoute(string hostNameOrAddress, int ttl)
        {
          Ping pinger = new Ping();
          PingOptions pingerOptions = new PingOptions(ttl, true);
          int timeout = 10000;
          byte[] buffer = Encoding.ASCII.GetBytes(Data);
          PingReply reply = default(PingReply);
    
          reply = pinger.Send(hostNameOrAddress, timeout, buffer, pingerOptions);
    
          List result = new List();
          if (reply.Status == IPStatus.Success)
          {
            result.Add(reply.Address);
          }
          else if (reply.Status == IPStatus.TtlExpired || reply.Status == IPStatus.TimedOut)
          {
            //add the currently returned address if an address was found with this TTL
            if (reply.Status == IPStatus.TtlExpired) result.Add(reply.Address);
            //recurse to get the next address...
            IEnumerable tempResult = default(IEnumerable);
            tempResult = GetTraceRoute(hostNameOrAddress, ttl + 1);
            result.AddRange(tempResult);
          }
          else
          {
            //failure 
          }
    
          return result;
        }
      }
    }
    

    And a VB version for anyone that wants/needs it

    Public Class TraceRoute
        Private Const Data As String = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    
        Public Shared Function GetTraceRoute(ByVal hostNameOrAddress As String) As IEnumerable(Of IPAddress)
            Return GetTraceRoute(hostNameOrAddress, 1)
        End Function
        Private Shared Function GetTraceRoute(ByVal hostNameOrAddress As String, ByVal ttl As Integer) As IEnumerable(Of IPAddress)
            Dim pinger As Ping = New Ping
            Dim pingerOptions As PingOptions = New PingOptions(ttl, True)
            Dim timeout As Integer = 10000
            Dim buffer() As Byte = Encoding.ASCII.GetBytes(Data)
            Dim reply As PingReply
    
            reply = pinger.Send(hostNameOrAddress, timeout, buffer, pingerOptions)
    
            Dim result As List(Of IPAddress) = New List(Of IPAddress)
            If reply.Status = IPStatus.Success Then
                result.Add(reply.Address)
            ElseIf reply.Status = IPStatus.TtlExpired Then
                'add the currently returned address
                result.Add(reply.Address)
                'recurse to get the next address...
                Dim tempResult As IEnumerable(Of IPAddress)
                tempResult = GetTraceRoute(hostNameOrAddress, ttl + 1)
                result.AddRange(tempResult)
            Else
                'failure 
            End If
    
            Return result
        End Function
    End Class
    

提交回复
热议问题