Использование ping в c #


88

Когда я пингую удаленную систему с Windows, он говорит, что нет ответа, но когда я пингую с помощью C #, он говорит об успехе. Винда верна, устройство не подключено. Почему мой код может успешно проверять связь, а 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 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 правильный.
Black Star

В моем случае, если «включить процесс хостинга визуальной студии» (местоположение == >> проект-> свойство-> отладка) отключен, метод ping может не работать. Пожалуйста попробуйте!
Стив

Ответы:


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
@Jamie, ты забыл про ";" в конце строки.
Sharpowski

8
Это только код ответа . Думаю, он реализует правильное сравнение и показывает, как обрабатывать возможные исключения. Не могли бы вы указать, почему это правильный код по сравнению с кодом в вопросе?
Maarten Bodewes

7
Не знаю, сколько людей использовали этот ответ, скопировав и вставив: / По крайней мере using (var pinger = new Ping()) { .. }, ранние возвраты настолько злы?
Питер Шнайдер

2
Нет смысла оборачивать экземпляр Ping с помощью using, если try / catch / finally используется правильно. Одно или другое, а не то и другое одновременно. См. Stackoverflow.com/questions/278902/… .
JamieSee 01

3
@JamieSee Хотя это может быть правдой, его лучше использовать usingвместо этого, и в этом случае он предпочтительнее.
Келли Элтон

40

Использование ping в C # достигается за счет использования метода Ping.Send(System.Net.IPAddress), который запускает запрос ping на предоставленный (действительный) IP-адрес или URL и получает ответ, который называется пакетом протокола управляющих сообщений Интернета (ICMP) . Пакет содержит заголовок из 20 байтов, который содержит данные ответа от сервера, получившего запрос проверки связи. Пространство System.Net.NetworkInformationимен .Net framework содержит класс с именем, PingReplyкоторый имеет свойства, предназначенные для преобразования ICMPответа и доставки полезной информации о проверяемом сервере, например:

  • IPStatus : получает адрес узла, который отправляет эхо-ответ протокола управляющих сообщений Интернета (ICMP).
  • IPAddress : получает количество миллисекунд, затраченных на отправку эхо-запроса протокола управляющих сообщений Интернета (ICMP) и получение соответствующего сообщения эхо-ответа ICMP.
  • RoundtripTime (System.Int64) : получает параметры, используемые для передачи ответа на эхо-запрос протокола управляющих сообщений Интернета (ICMP).
  • PingOptions (System.Byte []) : получает буфер данных, полученных в ответном эхо-сообщении протокола управляющих сообщений Интернета (ICMP).

Ниже приведен простой пример, 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
Разве вы не можете просто написать несколько строк и объяснить свой код? Потому что это бесполезно для людей, которые хотят понять этот фрагмент кода ...
Hille

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
Разве вы не можете просто написать несколько строк и объяснить свой код? Потому что это бесполезно для людей, которые хотят понять этот фрагмент кода ...
Hille
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.