Verwenden von Ping in c #

87

Wenn ich ein Remote-System mit Windows anpinge, wird keine Antwort angezeigt, aber wenn ich mit c # anpinge, wird Erfolg angezeigt. Windows ist korrekt, das Gerät ist nicht verbunden. Warum kann mein Code erfolgreich pingen, wenn Windows dies nicht ist?

Hier ist mein Code:

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");
}
Schwarzer Stern
quelle
4
Schauen Sie sich das folgende Beispiel unten auf dieser Seite an, wenn Sie auf den MSDN-Link msdn.microsoft.com/en-us/library/… oder stackoverflow.com/questions/1281176/… klicken
MethodMan
8
Sie sollten PR.Status mit IPStatus.Success vergleichen. Der Zeichenfolgenvergleich ist in diesem Fall nicht das richtige Werkzeug.
Sam Axe
Nachdem Sie Ihre Ping ausführen, was sind die Werte von einigen der PingReply Eigenschaften (wie PR.Address, PR.RoundtripTime, PR.reply.Buffer.Lengthund PR.Options.Ttl)? Sind Sie auch sicher, dass Sie die richtige IP-Adresse in Ihrem Code haben und keine Test-IP-Adresse?
Jon Senchyna
Jon Senchyna: Ich habe sie nicht eingestellt und ja, ich bin sicher, dass meine IP korrekt ist.
Black Star
In meinem Fall funktioniert die Ping-Methode möglicherweise nicht, wenn "Hosting-Prozess für Visual Studio aktivieren" (Speicherort ist == >> project-> property-> debug) deaktiviert ist. bitte versuche!
Steve

Antworten:

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;
}
JamieSee
quelle
1
@JamieSee du hast vergessen ";" am Ende der Zeile.
Sharpowski
8
Dies ist eine reine Code-Antwort . Ich denke, es implementiert einen korrekten Vergleich und zeigt, wie man mit möglichen Ausnahmen umgeht. Können Sie angeben, warum dies der richtige Code im Vergleich zum Code in der Frage ist?
Maarten Bodewes
7
Sie wissen nicht, wie viele Leute diese Antwort durch Kopieren und Einfügen verwendet haben: / Mindestens a using (var pinger = new Ping()) { .. }und sind frühe Rückgaben so böse?
Peter Schneider
2
Es macht keinen Sinn, die Ping-Instanz mit einem using zu versehen, wenn try / catch / finally ordnungsgemäß verwendet wird. Es ist das eine oder andere, nicht beides. Siehe stackoverflow.com/questions/278902/… .
JamieSee
3
@JamieSee Das mag zwar zutreffen, ist aber sauberer zu verwenden usingund wird in diesem Fall bevorzugt.
Kelly Elton
38

Die Verwendung von Ping in C # wird mithilfe der Methode erreicht Ping.Send(System.Net.IPAddress), die eine Ping-Anforderung an die angegebene (gültige) IP-Adresse oder URL ausführt und eine Antwort erhält, die als ICMP-Paket (Internet Control Message Protocol) bezeichnet wird . Das Paket enthält einen Header von 20 Bytes, der die Antwortdaten des Servers enthält, der die Ping-Anforderung empfangen hat. Der .Net-Framework- System.Net.NetworkInformationNamespace enthält eine aufgerufene Klasse PingReplymit Eigenschaften, mit denen die ICMPAntwort übersetzt und nützliche Informationen über den Ping-Server bereitgestellt werden können, z.

  • IPStatus : Ruft die Adresse des Hosts ab, der die ICMP- Echoantwort (Internet Control Message Protocol) sendet.
  • IPAddress : Ruft die Anzahl der Millisekunden ab, die zum Senden einer ICMP- Echoanforderung (Internet Control Message Protocol) und zum Empfangen der entsprechenden ICMP-Echoantwortnachricht benötigt werden.
  • Rundreise (System.Int64) : Ruft die verwendeten Optionen , um die Antwort auf eine Internet Control Message Protocol (ICMP) Echo - Anforderung zu übertragen.
  • PingOptions (System.Byte []) : Ruft den Datenpuffer ab, der in einer ICMP- Echoantwortnachricht ( Internet Control Message Protocol) empfangen wurde.

Das folgende Beispiel zeigt anhand eines einfachen Beispiels WinForms, wie Ping in c # funktioniert. Durch Angabe einer gültigen IP-Adresse textBox1und Klicken auf button1erstellen wir eine Instanz der PingKlasse, eine lokale Variable PingReplyund eine Zeichenfolge zum Speichern der IP- oder URL-Adresse. Wir weisen PingReplydie Ping- SendMethode zu und prüfen dann, ob die Anforderung erfolgreich war, indem wir den Status der Antwort mit dem Eigenschaftsstatus vergleichen IPAddress.Success. Schließlich extrahieren wir aus PingReplyden Informationen, die wir für den Benutzer anzeigen müssen, wie oben beschrieben.

    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!!");
                }
            }
        }
    }
Ashraf Abusada
quelle
10
Ein großes Lob für die Aufnahme der Referenz!
Mattpm
1
Können Sie nicht einfach ein paar Zeilen schreiben und Ihren Code erklären? Couse dies ist nicht nützlich für Leute, die dieses Stück Code verstehen wollen ...
Hille
4
Sicher, @Hille, ich habe diese Antwort vor ein paar Jahren schnell geschrieben. Ich werde die Antwort bearbeiten und eine entsprechende Beschreibung hinzufügen.
Ashraf Abusada
1

Importiert System.Net.NetworkInformation

Öffentliche Funktion 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
Saleem Basha
quelle
-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();
}
Mr. Mayar
quelle
3
Können Sie nicht einfach ein paar Zeilen schreiben und Ihren Code erklären? Couse dies ist nicht nützlich für Leute, die dieses Stück Code verstehen wollen ...
Hille