Utilizzo di ping in c #


88

Quando eseguo il ping di un sistema remoto con Windows dice che non c'è risposta, ma quando eseguo il ping con c # dice successo. Windows è corretto, il dispositivo non è connesso. Perché il mio codice è in grado di eseguire correttamente il ping quando Windows non lo è?

Ecco il mio codice:

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
Controlla la seguente esempio postato in fondo a questa pagina quando si fa clic sul link MSDN msdn.microsoft.com/en-us/library/... o stackoverflow.com/questions/1281176/...
Method Man

8
Dovresti confrontare PR.Status con IPStatus.Success. Il confronto tra stringhe non è lo strumento corretto in questo caso.
Sam Axe

Dopo aver eseguito il ping, quali sono i valori di alcune delle proprietà PingReply, (come PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length, e PR.Options.Ttl)? Inoltre sei sicuro di avere l'indirizzo IP corretto nel tuo codice e non un indirizzo IP di prova?
Jon Senchyna

Jon Senchyna: Non li ho impostati e sì, sono sicuro che il mio IP sia corretto.
Black Star

Nel mio caso, se "abilita il processo di hosting dello studio visivo" (la posizione è == >> progetto-> proprietà-> debug) è disabilitato, il metodo ping potrebbe non funzionare. vi preghiamo di provare!
steve

Risposte:


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 ti sei dimenticato di ";" alla fine della riga.
Sharpowski

8
Questa è solo una risposta in codice . Immagino che implementa un confronto corretto e mostra come gestire le possibili eccezioni. Potresti indicare perché questo è il codice corretto rispetto al codice nella domanda?
Maarten Bodewes

7
Non so quante persone hanno usato questa risposta per copia e incolla: / Fai almeno un using (var pinger = new Ping()) { .. }e i primi ritorni sono così cattivi?
Peter Schneider

2
Non ha senso avvolgere l'istanza di Ping con un utilizzo se try / catch / latest è impiegato correttamente. È l'uno o l'altro, non entrambi. Vedi stackoverflow.com/questions/278902/… .
Jamie Vedi

3
@JamieSee Anche se questo può essere vero, è più pulito da usare usinged è preferito in questo caso.
Kelly Elton

40

L'utilizzo del ping in C # viene ottenuto utilizzando il metodo Ping.Send(System.Net.IPAddress), che esegue una richiesta di ping all'indirizzo IP o URL fornito (valido) e ottiene una risposta denominata pacchetto ICMP (Internet Control Message Protocol) . Il pacchetto contiene un'intestazione di 20 byte che contiene i dati di risposta dal server che ha ricevuto la richiesta ping. Lo System.Net.NetworkInformationspazio dei nomi .Net framework contiene una classe chiamata PingReplyche ha proprietà progettate per tradurre la ICMPrisposta e fornire informazioni utili sul server su cui è stato eseguito il ping come:

  • IPStatus : ottiene l'indirizzo dell'host che invia la risposta echo ICMP (Internet Control Message Protocol).
  • IPAddress : ottiene il numero di millisecondi necessari per inviare una richiesta di eco ICMP (Internet Control Message Protocol) e ricevere il messaggio di risposta echo ICMP corrispondente.
  • RoundtripTime (System.Int64) : Ottiene le opzioni utilizzate per trasmettere la risposta a una richiesta echo ICMP (Internet Control Message Protocol).
  • PingOptions (System.Byte []) : Ottiene il buffer dei dati ricevuti in un messaggio di risposta echo ICMP (Internet Control Message Protocol).

Il seguente è un semplice esempio che utilizza WinFormsper dimostrare come funziona il ping in c #. Fornendo un indirizzo IP valido textBox1e facendo clic button1, creiamo un'istanza della Pingclasse, una variabile locale PingReplye una stringa per memorizzare l'indirizzo IP o URL. Assegniamo PingReplyil Sendmetodo ping , quindi controlliamo se la richiesta è andata a buon fine confrontando lo stato della risposta con lo IPAddress.Successstato della proprietà . Infine, estraiamo dalle PingReplyinformazioni che abbiamo bisogno di mostrare all'utente, che è descritto sopra.

    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
Complimenti per aver incluso il riferimento usando!
mattpm

1
Non puoi scrivere solo poche righe e spiegare il tuo codice? Perché questo non è utile per le persone che vogliono capire questo pezzo di codice ...
Hille

4
Certo @Hille, ho scritto questa risposta velocemente un paio di anni fa, modificherò e aggiungerò una descrizione appropriata della risposta.
Ashraf Abusada

2

Importa System.Net.NetworkInformation

Funzione pubblica PingHost (ByVal nameOrAddress As String) As Boolean Dim pingable As Boolean = False Dim pinger As Ping Dim lPingReply As 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
Non puoi scrivere solo poche righe e spiegare il tuo codice? Perché questo non è utile per le persone che vogliono capire questo pezzo di codice ...
Hille
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.