Usando ping en c #


88

Cuando hago ping a un sistema remoto con Windows, dice que no hay respuesta, pero cuando hago ping con c # dice éxito. Windows es correcto, el dispositivo no está conectado. ¿Por qué mi código puede hacer ping con éxito cuando Windows no?

Aquí está mi código:

Ping p1 = new Ping();
PingReply PR = p1.Send("192.168.2.18");
// check when the ping is not success
while (!PR.Status.ToString().Equals("Success"))
{
    Console.WriteLine(PR.Status.ToString());
    PR = p1.Send("192.168.2.18");
}
// check after the ping is n success
while (PR.Status.ToString().Equals("Success"))
{
    Console.WriteLine(PR.Status.ToString());
    PR = p1.Send("192.168.2.18");
}

4
Consulte el siguiente ejemplo publicado en la parte inferior de esta página al hacer clic en MSDN Link msdn.microsoft.com/en-us/library/… o stackoverflow.com/questions/1281176/…
MethodMan

8
Debería comparar PR.Status con IPStatus.Success. La comparación de cadenas no es la herramienta correcta en este caso.
Sam Axe

Después de realizar el ping, ¿cuáles son los valores de algunas de las propiedades PingReply, (como PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length, y PR.Options.Ttl)? ¿También está seguro de que tiene la dirección IP correcta en su código y no una dirección IP de prueba?
Jon Senchyna

Jon Senchyna: No los configuro y sí, estoy seguro de que mi IP es correcta.
Black Star

En mi caso, si "habilitar el proceso de alojamiento de Visual Studio" (la ubicación es == >> proyecto-> propiedad-> depuración) deshabilitado, es posible que el método ping no funcione. ¡por favor, inténtalo!
steve

Respuestas:


216
using System.Net.NetworkInformation;    

public static bool PingHost(string nameOrAddress)
{
    bool pingable = false;
    Ping pinger = null;

    try
    {
        pinger = new Ping();
        PingReply reply = pinger.Send(nameOrAddress);
        pingable = reply.Status == IPStatus.Success;
    }
    catch (PingException)
    {
        // Discard PingExceptions and return false;
    }
    finally
    {
        if (pinger != null)
        {
            pinger.Dispose();
        }
    }

    return pingable;
}

1
@JamieSee que te olvidaste de ";" al final de la línea.
Sharpowski

8
Esta es una respuesta de solo código . Supongo que implementa una comparación correcta y muestra cómo manejar posibles excepciones. ¿Podría indicar por qué este es el código correcto en comparación con el código de la pregunta?
Maarten Bodewes

7
No sé cuántas personas han usado esta respuesta copiando y pegando: / ¿Al menos un using (var pinger = new Ping()) { .. }y son tan malos los retornos anticipados?
Peter Schneider

2
No tiene sentido envolver la instancia de Ping con un uso si try / catch / finalmente se emplea correctamente. Es uno o el otro, no ambos. Consulte stackoverflow.com/questions/278902/… .
Jamie Ver

3
@JamieSee Si bien eso puede ser cierto, es más limpio de usar usingen su lugar, y se prefiere en este caso.
Kelly Elton

40

El uso de ping en C # se logra mediante el método Ping.Send(System.Net.IPAddress), que ejecuta una solicitud de ping a la dirección IP o URL proporcionada (válida) y obtiene una respuesta que se denomina paquete de Protocolo de mensajes de control de Internet (ICMP) . El paquete contiene un encabezado de 20 bytes que contiene los datos de respuesta del servidor que recibió la solicitud de ping. El System.Net.NetworkInformationespacio de nombres de .Net framework contiene una clase llamada PingReplyque tiene propiedades diseñadas para traducir la ICMPrespuesta y brindar información útil sobre el servidor al que se hizo ping, como:

  • IPStatus : Obtiene la dirección del host que envía la respuesta de eco del Protocolo de mensajes de control de Internet (ICMP).
  • IPAddress : Obtiene el número de milisegundos necesarios para enviar una solicitud de eco del Protocolo de mensajes de control de Internet (ICMP) y recibir el mensaje de respuesta de eco ICMP correspondiente.
  • RoundtripTime (System.Int64) : Obtiene las opciones utilizadas para transmitir la respuesta a una solicitud de eco del Protocolo de mensajes de control de Internet (ICMP).
  • PingOptions (System.Byte []) : Obtiene el búfer de datos recibidos en un mensaje de respuesta de eco del Protocolo de mensajes de control de Internet (ICMP).

El siguiente es un ejemplo simple que se usa WinFormspara demostrar cómo funciona el ping en c #. Al proporcionar una dirección IP válida textBox1y hacer clic button1, estamos creando una instancia de la Pingclase, una variable local PingReplyy una cadena para almacenar la dirección IP o URL. Asignamos PingReplyal Sendmétodo de ping , luego inspeccionamos si la solicitud fue exitosa comparando el estado de la respuesta con el IPAddress.Successestado de la propiedad . Finalmente, extraemos de PingReplyla información que necesitamos mostrar al usuario, que se describe anteriormente.

    using System;
    using System.Net.NetworkInformation;
    using System.Windows.Forms;

    namespace PingTest1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Ping p = new Ping();
                PingReply r;
                string s;
                s = textBox1.Text;
                r = p.Send(s);

                if (r.Status == IPStatus.Success)
                {
                    lblResult.Text = "Ping to " + s.ToString() + "[" + r.Address.ToString() + "]" + " Successful"
                       + " Response delay = " + r.RoundtripTime.ToString() + " ms" + "\n";
                }
            }

            private void textBox1_Validated(object sender, EventArgs e)
            {
                if (string.IsNullOrWhiteSpace(textBox1.Text) || textBox1.Text == "")
                {
                    MessageBox.Show("Please use valid IP or web address!!");
                }
            }
        }
    }

10
¡Felicitaciones por incluir la referencia de uso!
mattpm

1
¿No puedes escribir unas pocas líneas y explicar tu código? Porque esto no es útil para las personas que quieren entender este fragmento de código ...
Hille

4
Claro que @Hille, escribí esta respuesta rápidamente hace un par de años, editaré y agregaré una descripción apropiada de la respuesta.
Ashraf Abusada

2

Importaciones System.Net.NetworkInformation

Función pública PingHost (ByVal nameOrAddress As String) As Boolean Dim pingable As Boolean = False Dim pinger Como Ping Dim lPingReply Como PingReply

    Try
        pinger = New Ping()
        lPingReply = pinger.Send(nameOrAddress)
        MessageBox.Show(lPingReply.Status)
        If lPingReply.Status = IPStatus.Success Then

            pingable = True
        Else
            pingable = False
        End If


    Catch PingException As Exception
        pingable = False
    End Try
    Return pingable
End Function

-9
private void button26_Click(object sender, EventArgs e)
{
    System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo();
    proc.FileName = @"C:\windows\system32\cmd.exe";
    proc.Arguments = "/c ping -t " + tx1.Text + " ";
    System.Diagnostics.Process.Start(proc);
    tx1.Focus();
}

private void button27_Click(object sender, EventArgs e)
{
    System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo();
    proc.FileName = @"C:\windows\system32\cmd.exe";
    proc.Arguments = "/c ping  " + tx2.Text + " ";
    System.Diagnostics.Process.Start(proc);
    tx2.Focus();
}

3
¿No puedes escribir unas pocas líneas y explicar tu código? Porque esto no es útil para las personas que quieren entender este fragmento de código ...
Hille
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.