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");
}
PR.Address
,PR.RoundtripTime
,PR.reply.Buffer.Length
, yPR.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?Respuestas:
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; }
fuente
using (var pinger = new Ping()) { .. }
y son tan malos los retornos anticipados?using
en su lugar, y se prefiere en este caso.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. ElSystem.Net.NetworkInformation
espacio de nombres de .Net framework contiene una clase llamadaPingReply
que tiene propiedades diseñadas para traducir laICMP
respuesta y brindar información útil sobre el servidor al que se hizo ping, como:El siguiente es un ejemplo simple que se usa
WinForms
para demostrar cómo funciona el ping en c #. Al proporcionar una dirección IP válidatextBox1
y hacer clicbutton1
, estamos creando una instancia de laPing
clase, una variable localPingReply
y una cadena para almacenar la dirección IP o URL. AsignamosPingReply
alSend
método de ping , luego inspeccionamos si la solicitud fue exitosa comparando el estado de la respuesta con elIPAddress.Success
estado de la propiedad . Finalmente, extraemos dePingReply
la 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!!"); } } } }
fuente
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
fuente
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(); }
fuente