С# Тестирование активного интернет-соединения. Pinging google.com
С# 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;
}
}
Единственный способ, по которому я могу проверить подключение к Интернету, - это выполнить ping на www.google.com. Таким образом, я использую таймер сервера, который я установил за 500 миллисекунд, а в истекшем случае он будет вызывать эту функцию ping. Если ping возвращает false. Затем мое приложение предпримет соответствующие действия.
Считаете ли вы, что использование Google в качестве способа протестировать подключение к Интернету - это хорошо. Если google завершилось с ошибкой, мое приложение не будет работать. Является ли опрос на 1/2 секунды слишком много или слишком мало? Просто интересно о моей идее, если это хорошо или нет?
Большое спасибо,
Ответы
Ответ 1
Зачем пинговать Google? Единственный сервер, на которого вы действительно волнуетесь, - это веб-сервер, с которым вы хотите поговорить, не так ли? Так что пинг это. Таким образом, вы можете уведомить пользователя, если что-то не так между ними и веб-сервером - это единственное, что имеет значение.
Если что-то пойдет не так с Интернетом, что означает, что пользователь может делать что-либо только в своем городе, вы не сможете добраться до Google, но если вы все еще можете связаться с интересующим вас веб-сервером, зачем сообщать проблема? С другой стороны, если веб-сервер идет вниз, но Google не делает этого, почему бы вам не захотеть сообщить пользователю о наличии проблемы?
Аналогично, зачем использовать пинг? Почему бы не отправить HTTP-запрос на известный URL-адрес на веб-сервере? В конце концов, если сеть не работает, но сам процесс веб-сервера не работает, это точно так же плохо, как и сеть пользователя.
EDIT: Я не заметил в вопросе, что вы повторяли это каждые полсекунды. Это действительно не нравится никому. Конечно, раз в минуту достаточно часто, не так ли?
Ответ 2
Проверьте этот повторяющийся вопрос, который имеет хороший ответ, который не требует ping:
С# - Как проверить сетевое подключение
Вы можете подписаться на событие System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged, и только тогда, когда он указывает, что сеть отключена, выполните запрос ping/web на сервер, чтобы узнать, доступно ли это.
Ответ 3
Мне может быть что-то не хватает, но почему вам нужно проверить, что сервер запущен, и веб-сервис работает, прежде чем вам нужно его использовать? Если вы вызываете метод в своих веб-сервисах, и вы не получаете своевременного ответа, то выполняйте какие-либо действия, которые вам подходят или нужны?
Это просто похоже на разработку дизайна.
[править]
Спасибо за разъяснение robUK. Вы должны послушать эпизод подкаста NET Rocks "Udi Dahan Scales Web Applications!" (дата 12/08/2008). Они обсуждают добавление GUID в запрос и ждут, пока вы получите тот же идентификатор GUID в ответе. Может быть, вы можете уволить его каждую секунду за 10 попыток, и если вы не получите ответ назад (с прикрепленным GUID) после 10 попыток, выполните требуемые действия?
Удачи вам в этом.
Ответ 4
У меня есть приложение, которое должно сделать что-то подобное. У нас немного другая архитектура, а именно шина pub/sub message. Для тех приложений, которые заинтересованы в прослушивании "сердечных сокращений" из различных сервисов, мы разрешаем им регистрировать свой интерес с автобусом. Каждые несколько секунд каждая служба будет публиковать сообщение состояния работоспособности, которое затем получат потребители. Если потребители не получают сообщение о состоянии работоспособности в течение определенного времени, они могут предпринять соответствующие действия, пока они не услышат его снова.
Эта настройка намного более масштабируема, чем опрос сервера или даже хуже, если он будет его проверять. Представьте себе, если у вас было 100 или 1000 клиентов, все опросы или pinging ваш разорвать каждые несколько секунд. Bad.
Ответ 5
вы можете просто протестировать это
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int conn, int val);
Полный исходный код С#
http://net-informations.com/csprj/communications/internet-connection.htm
Ответ 6
Было бы предложено поставить более 0,5 с, потому что иногда ваша lataency может получить больше. Я иногда даже 3.5s на DSL.
Ответ 7
Лучше узнать, находитесь ли вы в сети, чем беспокоить сервер, пинговавший его. См. Обнаружение интернет-соединения V. local lan. Если вы находитесь в Windows 7/Server 2008 R2, вы можете получить событие, когда произойдет изменение связи, что будет намного счастливее для всех, чем постоянный pinging и опрос.
Ответ 8
Несмотря на то, что я согласен с Джоном в том, что проверка вашего веб-сервера может быть лучшей идеей, я хочу бросить другое решение, которое может использоваться автономно или вместе с начальным ping для службы.
Это встроенное событие в классе 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.