C # Тестирование активного интернет-соединения. Пинг google.com - PullRequest
14 голосов
/ 29 апреля 2009

C # 2008

Я использую этот код для проверки интернет-соединения. Поскольку мое приложение должно будет войти на веб-сервер. Тем не менее, если пользовательский интернет-соединение прервалось или кабель был отключен. Я должен буду уведомить пользователя.

 // Ping www.google.com to check if the user has a internet connection.
    public bool PingTest()
    {
        Ping ping = new Ping();

        PingReply pingStatus = ping.Send(IPAddress.Parse("208.69.34.231"));

        if (pingStatus.Status == IPStatus.Success)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

Единственный способ проверки подключения к Интернету - это пинг www.google.com. Итак, у меня есть серверный таймер, который я установил на 500 миллисекунд, и в случае истечения срока он вызовет эту функцию ping. Если пинг возвращает false. Тогда мое приложение предпримет соответствующие действия.

Как вы думаете, использование Google для проверки интернет-соединения - это хорошо. Если Google потерпит неудачу, мое приложение не будет работать. Половина опроса - это много или мало? Просто интересуюсь всей моей идеей, хорошо это или нет?

Большое спасибо,

Ответы [ 8 ]

23 голосов
/ 29 апреля 2009

Зачем пинговать гугл? Единственный сервер, который вас действительно волнует - это веб-сервер, с которым вы хотите общаться, верно? Так что пинг это вместо. Таким образом, вы можете уведомить пользователя, если что-то не так между ним и веб-сервером - это единственное, что имеет значение.

Если с интернетом что-то не так, что означает, что пользователь может делать только что-то в своем городе, вы не сможете связаться с Google, но если вы все равно можете добраться до интересующего вас веб-сервера, зачем сообщать об этом? проблема? С другой стороны, если веб-сервер отключается, а Google - нет, с чего бы вам не хотеть сообщить пользователю о наличии проблемы?

Кроме того, зачем использовать пинг? Почему бы не отправить HTTP-запрос на известный URL на веб-сервере? В конце концов, если сеть работает, но сам процесс веб-сервера не работает, это точно так же плохо, как и отключение сети пользователя.

РЕДАКТИРОВАТЬ: Я не заметил в вопросе, что вы повторяли это каждые полсекунды. Это действительно никому не нравится. Конечно, раз в минуту достаточно часто, не так ли?

6 голосов
/ 02 июля 2009

Проверьте этот дубликат вопроса, на который есть хороший ответ, не требующий пинга:

C # - Как проверить сетевое соединение

Вы можете подписаться на событие System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged и только тогда, когда оно указывает, что сеть не работает, выполнить запрос ping / web на сервер, чтобы узнать, доступно ли оно.

2 голосов
/ 23 марта 2012

Вы можете просто проверить, как это

[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int conn, int val);

C # полный исходный код

http://net -informations.com / csprj / связь / Интернет-Connection.htm

2 голосов
/ 29 апреля 2009

У меня есть приложение, которое должно сделать что-то подобное. У нас есть немного другая архитектура, а именно шина сообщений паба / субсети. Для тех приложений, которые заинтересованы в прослушивании «сердцебиения» от различных служб, мы разрешаем им регистрировать свои интересы в автобусе. Каждые несколько секунд каждая служба будет публиковать сообщение о состоянии работоспособности, которое затем будут получать потребители. Если потребители не получают сообщения о состоянии работоспособности в течение определенного времени, они могут предпринимать соответствующие действия, пока не услышат его снова.

Эта настройка гораздо более масштабируема, чем опрос сервера или, что еще хуже, проверяет его. Представьте, что у вас есть 100 или 1000 клиентов, которые каждые несколько секунд опрашивают или проверяют свой сервер. Плохо.

2 голосов
/ 29 апреля 2009

Возможно, я что-то упускаю, но зачем вам проверять, работает ли сервер и работает ли веб-служба, прежде чем использовать ее? Если вы вызываете метод в своих веб-службах и не получаете своевременного ответа, тогда предпримите какие-либо действия, которые вы считаете нужными или необходимыми?

Это только кажется, над разработкой дизайна.

[править]

Спасибо за разъяснение robUK. Вы должны прослушать эпизод подкаста NET Rocks «Веб-приложения Udi Dahan Scales!» (дата 12.08.2008). Они обсуждают добавление GUID к запросу и ждут, пока вы не получите тот же GUID в ответе. Может быть, вы могли бы запустить его каждую секунду, скажем, для 10 попыток, и если вы не получили ответ (с прикрепленным GUID) после 10 попыток, то предпримите необходимое действие?

Удачи с этим ..

1 голос
/ 12 июля 2010

Лучше увидеть, если вы находитесь в сети, чем беспокоить сервер, проверяющий его. См., Например, Обнаружение Интернета V. локальная локальная сеть . Если вы работаете в Windows 7 / Server 2008 R2, вы можете получить событие при изменении подключения, которое будет намного счастливее для всех, чем постоянный пинг и опрос.

1 голос
/ 29 апреля 2009

Было бы предложено поставить больше 0,5 с, потому что иногда ваша задержка может стать выше. У меня иногда есть даже 3,5 с на DSL.

0 голосов
/ 28 апреля 2013

Несмотря на то, что я согласен с Джоном, пинг вашего веб-сервера может быть лучшей идеей, которую я хочу добавить в другое решение, которое может использоваться отдельно или вместе с начальным пингом для сервиса.

Это встроенное событие класса NetworkChange с именем NetworkAvailabilityChanged, которое можно использовать для получения общего состояния Windows независимо от того, подключены вы к сети или нет. Просто добавьте слушателя к нему, и тогда вы будете уведомлены, когда он изменится.

private void MyForm_Load(object sender, EventArgs e)
{
    NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
}

private void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
{
    if (e.IsAvailable)
    {
        WriteLog("Network is available again, updating items");
        timer1_Tick(sender, EventArgs.Empty);
        return;
    }

    WriteLog("Network isn't available at the moment");
}

Доступно с .Net 2.0 и выше. Более подробную информацию можно найти на MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...