Використання ping в c #


88

Коли я пінгую віддалену систему з Windows, він каже, що відповіді немає, але коли я пінгую за допомогою c #, це говорить про успіх. Windows правильно, пристрій не підключено. Чому мій код може успішно пінгувати, коли Windows не працює?

Ось мій код:

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
Перевірте наступний приклад розміщений в нижній частині цієї сторінки , коли ви натискаєте на MSDN Link msdn.microsoft.com/en-us/library / ... або stackoverflow.com/questions/1281176 / ...
Methodman

8
Ви повинні порівнювати PR.Status з IPStatus.Success. У цьому випадку порівняння рядків не є правильним інструментом.
Sam Axe

Після виконання вашого пінгу, які значення деяких властивостей PingReply, (як PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length, і PR.Options.Ttl)? Також ви впевнені, що у вашому коді є правильна IP-адреса, а не тестова IP-адреса?
Джон Сенчина

Джон Сенчина: Я їх не встановлюю, і так, я впевнений, що моя IP-адреса правильна.
Чорна зірка

У моєму випадку, якщо "увімкнути процес розміщення візуальної студії" (розташування == >> проект-> властивість-> налагодження) вимкнено, метод пінгу може не працювати. будь ласка, спробуй!
Стів

Відповіді:


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 ви забули про ";" в кінці рядка.
Шарповський

8
Це відповідь лише на код . Думаю, він реалізує правильне порівняння та показує, як обробляти можливі винятки. Не могли б ви вказати, чому це правильний код порівняно з кодом у питанні?
Маартен Бодеус

7
Не знаю, скільки людей скористалися цією відповіддю шляхом копіювання та вставлення: / Чи принаймні using (var pinger = new Ping()) { .. }та чи є ранні повернення такими злими?
Пітер Шнайдер

2
Немає сенсу обгортати екземпляр Ping за допомогою, якщо try / catch / нарешті використовується належним чином. Це те чи інше, не те й інше. Див. Stackoverflow.com/questions/278902/… .
JamieSee

3
@JamieSee Незважаючи на те, що це може бути правдою, usingзамість цього воно є чистішим , і в цьому випадку воно є кращим.
Келлі Елтон,

40

Використання ping в C # досягається за допомогою методу Ping.Send(System.Net.IPAddress), який запускає запит ping на надану (дійсну) IP-адресу або URL-адресу і отримує відповідь, яка називається пакетом протоколу ICMP (Internet Control Message Protocol) . Пакет містить заголовок розміром 20 байт, який містить дані відповіді від сервера, який отримав запит ping. System.Net.NetworkInformationПростір імен фреймворка .Net містить клас, який називається PingReplyвластивостями, призначеними для перекладу ICMPвідповіді та надання корисної інформації про перевірений сервером, наприклад:

  • IPStatus : Отримує адресу хоста, який надсилає відповідь ехо-сигналу за протоколом ICMP.
  • IPAddress : Отримує кількість мілісекунд, необхідних для надсилання запиту ехо-сигналу протоколу керування Інтернетом (ICMP) та отримання відповідного повідомлення-відповіді ехо-сигналу ICMP.
  • RoundtripTime (System.Int64) : Отримує параметри, що використовуються для передачі відповіді на запит відлуння протоколу ICMP.
  • PingOptions (System.Byte []) : Отримує буфер даних, отриманих у повідомленні ехо-відповіді протоколу ICMP (Internet Control Message Protocol).

Далі наведено простий приклад, WinFormsякий демонструє, як ping працює в c #. Надаючи дійсну IP-адресу textBox1та натискаючи button1, ми створюємо екземпляр Pingкласу, локальну змінну PingReplyта рядок для зберігання IP-адреси або URL-адреси. Ми призначаємо метод PingReplyping Send, а потім перевіряємо, чи був запит успішним, порівнюючи статус відповіді зі IPAddress.Successстатусом властивості . Нарешті, ми витягуємо з PingReplyінформації, яку нам потрібно відображати для користувача, яка описана вище.

    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
Похвала за включення посилання на використання!
mattpm

1
Чи не можете ви просто написати кілька рядків і пояснити свій код? Це не корисно для людей, які хочуть зрозуміти цей фрагмент коду ...
Хілле,

4
Звичайно @Hille, я швидко написав цю відповідь пару років тому, відредагую та додаю відповідний опис відповіді.
Ашраф Абусада

2

Імпортує System.Net.NetworkInformation

Відкрита функція 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
Чи не можете ви просто написати кілька рядків і пояснити свій код? Це не корисно для людей, які хочуть зрозуміти цей фрагмент коду ...
Хілле,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.