Как я могу справиться с Ping Exception в c# - PullRequest
2 голосов
/ 24 марта 2020

Я создал простой метод, чтобы проверить, активно ли мое соединение Inte rnet. К сожалению, раздел try становится пропущенным из-за System. Net .NetworkInformation.PingException »в System. Net .Ping.dll. Как хорошо заметили, проблема возникает с PingReply. Не могли бы вы рассказать мне, как справиться с этим исключением и разрешить запуск кода правильно, чтобы выполнить раздел try.

MyFunction:

    private void ConnectionStatusChecker(object source, ElapsedEventArgs e)
    {

        Ping myPing = new Ping();
        String host = "https://www.google.com/";
        byte[] buffer = new byte[32];
        int timeout = 1000;
        PingOptions pingOptions = new PingOptions();

        Ping ping = new Ping();
        try
        {
            PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
            if (reply.Status == IPStatus.Success)
                ConnectionStatus = "Connected";
            else
                ConnectionStatus = "Disconnected";
        }
        catch (System.Net.NetworkInformation.PingException)
        {
            ConnectionStatus = "Disconnected-Exception";
        }
    }

Редактировать: Я хотел бы сохранить в переменной ConnectionStatus информацию о моем подключении Inte rnet. В разделе Try описывается значение в случае отключения или подключения. Но PingException не позволяет мне проверить это - исключение автоматически блокирует раздел try. Дело в том, как бороться с этим исключением, где источник или ошибка, которую я сделал?

1 Ответ

1 голос
/ 24 марта 2020

Вы должны войти в систему InnerException, чтобы увидеть, что на самом деле происходит:

catch (PingException ex)
{
    Console.WriteLine(ex.InnerException);
    ConnectionStatus = "Disconnected-Exception";
}

, который выводит следующий вывод:

System.Net.Sockets.SocketException (11001): No such host is known.
   at System.Net.Dns.InternalGetHostByName(String hostName)
   at System.Net.Dns.GetHostAddresses(String hostNameOrAddress)
   at System.Net.NetworkInformation.Ping.GetAddressAndSend(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)

и также не работает для команды ping (убедившись, что результаты ожидаемые):

PS C:\Users\user> ping https://www.google.com/
Ping request could not find host https://www.google.com/. Please check the name and try again.

Это означает, что хост https://www.google.com/ не разрешает ответы ICMP для HTTPS. Вы можете взглянуть на Можете ли вы получить ответ с HTTPS-сайта с помощью команды Ping? , чтобы получить хорошее объяснение, почему это происходит.

Вы также можете проверить это в System.Net.NetworkInformation.Ping.Send() документации:

PingException

Исключение возникло при отправка или получение сообщений ICMP. См. Внутреннее исключение для точного исключения, которое было сгенерировано.

Вместо этого попробуйте пропинговать имя хоста www.google.com:

Ping myPing = new Ping();
String host = "www.google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();

string ConnectionStatus;

Ping ping = new Ping();
try
{
    PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
    if (reply.Status == IPStatus.Success)
        ConnectionStatus = "Connected";
    else
        ConnectionStatus = "Disconnected";
    }
catch (PingException ex)
{
    Console.WriteLine(ex.InnerException);
    ConnectionStatus = "Disconnected-Exception";
}

Console.WriteLine(ConnectionStatus);

, который не выводит никаких исключений, и соединение успешно:

Connected
...