Używanie Pingu w C #


88

Kiedy pinguję zdalny system z oknami, mówi, że nie ma odpowiedzi, ale kiedy pinguję z c #, mówi, że powiodło się. Windows jest poprawny, urządzenie nie jest podłączone. Dlaczego mój kod może pomyślnie pingować, podczas gdy Windows nie?

Oto mój kod:

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
Zapoznaj się z poniższym przykładem zamieszczonym na dole tej strony po kliknięciu łącza MSDN msdn.microsoft.com/en-us/library/… lub stackoverflow.com/questions/1281176/ ...
MethodMan

8
Powinieneś porównać PR.Status do IPStatus.Success. Porównanie ciągów nie jest w tym przypadku właściwym narzędziem.
Sam Axe

Po wykonaniu swój ping, jakie są wartości pewnych właściwości PingReply (jak PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length, i PR.Options.Ttl)? Czy na pewno masz w kodzie poprawny adres IP, a nie testowy adres IP?
Jon Senchyna

Jon Senchyna: Nie ustawiam ich i tak, jestem pewien, że moje IP jest poprawne.
Black Star

W moim przypadku, jeśli opcja „Włącz proces hostingu Visual Studio” (lokalizacja to == >> projekt-> właściwość-> debugowanie) jest wyłączona, metoda ping może nie działać. proszę spróbować!
steve

Odpowiedzi:


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 zapomniałeś o ";" na końcu linii.
Sharpowski,

8
To jest tylko kod odpowiedzi . Wydaje mi się, że implementuje poprawne porównanie i pokazuje, jak radzić sobie z ewentualnymi wyjątkami. Czy możesz wskazać, dlaczego jest to poprawny kod w porównaniu z kodem w pytaniu?
Maarten Bodewes

7
Nie wiem, ile osób skorzystało z tej odpowiedzi, kopiując i wklejając: / Czy przynajmniej using (var pinger = new Ping()) { .. }a wczesne powroty są tak złe?
Peter Schneider

2
Nie ma sensu owijać instancji Ping za pomocą using, jeśli try / catch / w końcu jest prawidłowo zastosowana. To jedno lub drugie, a nie oba. Zobacz stackoverflow.com/questions/278902/… .
Jamie Zobacz

3
@JamieSee Chociaż może to być prawda, usingzamiast tego jest bardziej przejrzysty i jest preferowany w tym przypadku.
Kelly Elton

40

Użycie polecenia ping w języku C # uzyskuje się za pomocą metody Ping.Send(System.Net.IPAddress), która uruchamia żądanie ping na podany (prawidłowy) adres IP lub adres URL i uzyskuje odpowiedź nazywaną pakietem protokołu ICMP (Internet Control Message Protocol) . Pakiet zawiera nagłówek o długości 20 bajtów, który zawiera dane odpowiedzi z serwera, który odebrał żądanie ping. Przestrzeń System.Net.NetworkInformationnazw platformy .Net zawiera klasę o nazwie, PingReplyktóra ma właściwości przeznaczone do tłumaczenia ICMPodpowiedzi i dostarczania przydatnych informacji o serwerze pingowanym, takich jak:

  • IPStatus : Pobiera adres hosta, który wysyła odpowiedź echa protokołu ICMP (Internet Control Message Protocol).
  • IPAddress : Pobiera liczbę milisekund potrzebnych do wysłania żądania echa protokołu ICMP (Internet Control Message Protocol) i odebrania odpowiedniego komunikatu odpowiedzi echa ICMP.
  • RoundtripTime (System.Int64) : Pobiera opcje używane do przesyłania odpowiedzi na żądanie echa protokołu ICMP (Internet Control Message Protocol).
  • PingOptions (System.Byte []) : Pobiera bufor danych odebranych w komunikacie odpowiedzi echa protokołu ICMP (Internet Control Message Protocol).

Poniżej znajduje się prosty przykład WinFormspokazujący, jak działa ping w języku C #. Podając prawidłowy adres IP textBox1i klikając button1, tworzymy wystąpienie Pingklasy, zmienną lokalną PingReplyi ciąg do przechowywania adresu IP lub URL. Przypisujemy PingReplydo Sendmetody ping , a następnie sprawdzamy, czy żądanie się powiodło, porównując stan odpowiedzi ze IPAddress.Successstanem właściwości . Na koniec wyodrębniamy z PingReplyinformacji, które musimy wyświetlić użytkownikowi, co opisano powyżej.

    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
Uznanie za dołączenie odwołania do korzystania!
Mattpm

1
Nie możesz po prostu napisać kilku wierszy i wyjaśnić swojego kodu? Ponieważ nie jest to przydatne dla osób, które chcą zrozumieć ten fragment kodu ...
Hille

4
Jasne @Hille, napisałem tę odpowiedź szybko kilka lat temu, poprawię i dodam odpowiedni opis odpowiedzi.
Ashraf Abusada

2

Importuje System.Net.NetworkInformation

Funkcja publiczna 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
Nie możesz po prostu napisać kilku wierszy i wyjaśnić swojego kodu? Ponieważ nie jest to przydatne dla osób, które chcą zrozumieć ten fragment kodu ...
Hille
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.