Saltar al contenido

TraceRoute y Ping en C#

Luego de de esta extensa compilación de datos pudimos solucionar este rompecabezas que tienen muchos usuarios. Te compartimos la respuesta y esperamos que te resulte de gran apoyo.

Solución:

Dado que tenía que escribir una clase TraceRoute hoy, pensé que también podría compartir el código fuente.

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)
     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;
    
  

Y una versión de VB para cualquiera que lo quiera/necesite

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

Lo que sigue es una implementación C# significativamente mejor de tracert que existe en otras respuestas hasta ahora.

public static IEnumerable GetTraceRoute(string hostname)

    // following are similar to the defaults in the "traceroute" unix command.
    const int timeout = 10000;
    const int maxTTL = 30;
    const int bufferSize = 32;

    byte[] buffer = new byte[bufferSize];
    new Random().NextBytes(buffer);

    using (var pinger = new Ping())
    
        for (int ttl = 1; ttl <= maxTTL; ttl++)
        
    

Las trampas corregidas aquí que están presentes en otras respuestas incluyen:

  • es perezoso Ej: utiliza correctamente enumerable/un iterador, por lo que no tiene que calcular todo el árbol, puede detenerse en cualquier punto saliendo de su propio ciclo de consumo.
  • maxTTL implementado para que la función no gire para siempre.
  • bufferSize opción que es consistente con otras implementaciones de tracert.
  • Es súper conciso y limpio. Está contenido en un solo método y es considerablemente más corto que otras opciones aquí.

Aunque la Biblioteca de clases base incluye Ping, la BCL no incluye ninguna funcionalidad de tracert.

Sin embargo, una búsqueda rápida revela dos intentos de código abierto, el primero en C# y el segundo en C++:

  • http://www.codeproject.com/KB/IP/tracert.aspx
  • http://www.codeguru.com/Cpp/IN/network/basicnetworkoperations/article.php/c5457/

Reseñas y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *