¿Alguien tiene el código de C# a mano para hacer un ping y un traceroute a una computadora de destino? Estoy buscando una solución de código puro, no lo que estoy haciendo ahora, que invoca el programa ping.exe y tracert.exe y analiza el resultado. Me gustaría algo más robusto.TraceRoute y Ping en C#
Respuesta
Aunque la Biblioteca de clases base incluye Ping, el BCL no incluye ninguna funcionalidad de tracert.
Sin embargo, una búsqueda rápida revela dos intentos de código abierto, la primera en C# la segunda en C++:
me gustaría empezar a buscar para ellos en el espacio de nombres System.Net
Para la parte de ping, echar un vistazo a la Ping class en MSDN.
Tenga una mirada en -
http://www.codeproject.com/KB/IP/Tracert-ping.aspx
Si usted puede permitirse el lujo de pagar, los widgets de redes Dart son bastante buenos:
http://www.dart.com/ctl_tracenet.aspx
Hay otra aplicación regalo de promoción aquí:
http://www.digigrupp.com/ping/ y aquí http://www.mltek.co.uk/traceclass.aspx
Éste resuelve el problema de ping sin utilizar tercero
http://www.aspnettutorials.com/tutorials/network/net-ping-aspnet2-csharp.aspx
Aquí se muestra cómo implementar traceoute http://coding.infoconex.com/post/2009/01/C-Traceroute-using-net-framework.aspx
y otra cómo implementar Ping. http://coding.infoconex.com/post/2009/01/C-Ping-and-Traceroute.aspx
Lo anterior reproduce el mismo comportamiento que Windows ping y traceroute y es muy simple de implementar.
enlaces están muertos (404) hoy. – Zartag
Dado que tuve 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<IPAddress> GetTraceRoute(string hostNameOrAddress)
{
return GetTraceRoute(hostNameOrAddress, 1);
}
private static IEnumerable<IPAddress> 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<IPAddress> result = new List<IPAddress>();
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<IPAddress> tempResult = default(IEnumerable<IPAddress>);
tempResult = GetTraceRoute(hostNameOrAddress, ttl + 1);
result.AddRange(tempResult);
}
else
{
//failure
}
return result;
}
}
}
y una versión VB para cualquier persona que quiere/necesita que
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
Solución fría. Punto menor, pero dado que usaste un retorno IEnumerable <>, podrías considerar realizar el rendimiento en lugar de poblar la lista. – Jeff
Si alguien tropieza con esto, tiene algunos problemas, incluido el hecho de que nunca puede regresar y girar para siempre. por favor mire https://stackoverflow.com/a/45565253/184746 – caesay
Como am mejoras al código Scotts respuesta anterior, he encontrado que su solución no funciona si la ruta se estrecha en la nada antes de llegar al destino - nunca regresa. Una mejor solución con al menos una ruta parcial podría ser esta (que he probado y funciona bien). Puede cambiar el '20' en el bucle for a algo más grande o más pequeño o tratar de detectar si tarda demasiado si desea controlar el número de iteraciones de otra manera. Todo el crédito a Scott por el código original - gracias.
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Text;
using System.Net;
...
public static void TraceRoute(string hostNameOrAddress)
{
for (int i = 1; i < 20; i++)
{
IPAddress ip = GetTraceRoute(hostNameOrAddress, i);
if(ip == null)
{
break;
}
Console.WriteLine(ip.ToString());
}
}
private static IPAddress GetTraceRoute(string hostNameOrAddress, int ttl)
{
const string Data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
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<IPAddress> result = new List<IPAddress>();
if (reply.Status == IPStatus.Success || reply.Status == IPStatus.TtlExpired)
{
return reply.Address;
}
else
{
return null;
}
}
Lo que sigue es una significativamente mejor C# aplicación de tracert
que existe en otras respuestas hasta el momento.
public static IEnumerable<IPAddress> GetTraceRoute(string hostname)
{
// following are the defaults for the "traceroute" command in unix.
const int timeout = 10000;
const int maxTTL = 30;
const int bufferSize = 32;
byte[] buffer = new byte[bufferSize];
new Random().NextBytes(buffer);
Ping pinger = new Ping();
for (int ttl = 1; ttl <= maxTTL; ttl++)
{
PingOptions options = new PingOptions(ttl, true);
PingReply reply = pinger.Send(hostname, timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
// Success means the tracert has completed
yield return reply.Address;
break;
}
if (reply.Status == IPStatus.TtlExpired)
{
// TtlExpired means we've found an address, but there are more addresses
yield return reply.Address;
continue;
}
if (reply.Status == IPStatus.TimedOut)
{
// TimedOut means this ttl is no good, we should continue searching
continue;
}
// if we reach here, it's a status we don't recognize and we should exit.
break;
}
}
trampas fijas aquí que están presentes en otras respuestas incluyen:
- Es perezoso. Por ejemplo, utiliza correctamente un enumerable/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 por lo que la función no se enciende para siempre.bufferSize
opción que es coherente 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í.
- 1. Usando ping en C#
- 2. ¿Puedo usar http tunnel para hacer ping o traceroute a través de un proxy con firewall?
- 3. Cómo traceroute en adb shell?
- 4. ¿Cómo funciona traceroute?
- 5. diferencia entre Ping en Windows y Ubuntu
- 6. Sitio ping y resultado devuelto en PHP
- 7. ¿Por qué traceroute envía paquetes UDP y no ICMP?
- 8. extraer tiempo promedio de ping -c
- 9. Suprimir el sistema ("ping") de salida en C++
- 10. ruby ping para 1.9.1
- 11. Ping un sitio en ruby?
- 12. Ping Pong con Haskell y Thrift se atasca
- 13. Bluetooth Ping Latency
- 14. ActiveMQ JMS ping
- 15. Android ICMP ping
- 16. Varios script de ping en Python
- 17. Haciendo un "ping" dentro de mi aplicación C#
- 18. enviando ping con cantidad de bytes específicos usando C#
- 19. problema de ping una dirección URL de C#
- 20. cómo hacer icmp ping en android
- 21. Hacer ping en las instancias de EC2
- 22. ¿Cómo hacer ping en JavaScript o jQuery?
- 23. Ping de red local en python
- 24. Ping con java a multiplataforma
- 25. Linux de ping emisión interruptor
- 26. Ping un sitio web en R
- 27. Servicio de Android - Ping URL
- 28. ¿Cuál es el mejor método para hacer ping en C++ en Linux?
- 29. Haga ping o indique si un dispositivo se encuentra en la red mediante MAC en C#
- 30. ¿Cómo puedo hacer ping a un host con un Perl one-liner con Net :: Ping?
El siguiente ejemplo de código demuestra el uso de la clase Ping sincrónicamente. Ver clase de Ping. – Kiquenet