Как определить наличие / отсутствие интернет-соединения на машине? - PullRequest
2 голосов
/ 03 октября 2009

Мне нужно обнаружить наличие / отсутствие интернет-соединения. Точнее, предположим, что приложение разбито на 2 части - A и B.

A отвечает за проверку того, подключена ли система к Интернету. Если он обнаруживает, что соединения нет, он запускает часть B. И как только он обнаруживает, что существует сетевое соединение, он убивает B и продолжает свою собственную работу.

Каков наилучший способ сделать часть приложения? Непрерывный пинг звучит отвратительно. Должен быть лучший способ сделать это (предпочтительно в C).

Ответы [ 6 ]

2 голосов
/ 03 октября 2009

С достаточными привилегиями вы можете тестировать различные сетевые интерфейсы и проверять их состояние. Это скажет вам, если какой-либо из интерфейсов был подключен к сети и работает. Тем не менее, это не скажет вам, является ли соединение действительно используемым, то есть подключено ли к Интернету (или вашей локальной сети, если это все, что вам нужно). Я в любом случае не знаю, как это сделать, если не использовать его.

Использование ICMP (ping) может быть полезно на низком уровне, но, вероятно, вам нужно соединение с реальной конечной точкой через TCP / IP для выполнения реальной работы. Я бы сказал, что вам следует изменить дизайн вашего приложения таким образом, чтобы B отвечал за указание, когда оно не может продолжить работу из-за отсутствия ресурсов, на которые оно полагается - по сети или иным образом. A и B должны общаться так, чтобы A знал о ситуации и мог либо убить B, либо ответить на B, завершивший себя и, таким образом, продолжающий свою работу.

1 голос
/ 03 октября 2009

Во многих компаниях приняты меры для предотвращения исходящих ICMP-запросов, TCP-соединений с портами, отличными от 80/443, например, или даже для предотвращения прямого доступа к Интернету (прозрачным образом) через прокси-сервер вашего трафика.

Под интернет-соединением я бы понял любой способ связи с внешним миром, будь то UDP, TCP или ICMP. В зависимости от того, для чего вашему приложению необходимо связаться с Интернетом, я бы посоветовал проверить тот же протокол, поскольку это единственное, что имеет значение для вашего приложения.

Если ваше приложение использует HTTP для связи с внешним источником, попробуйте подключиться к нескольким сайтам, которые, как вы подозреваете, не попали в черный список и имеют надежное время безотказной работы. Например, google.com, microsoft.com, apple.com и т. Д. ...

Edit:

Я не уверен, в чем специфика, поэтому позвольте мне привести пример с гипотетической ситуацией.

Приложение A собирает данные о системе, в которой оно работает, и пересылает ее веб-службе, прослушивающей yourserverhost.yourcompany.com:80 Приложение B в основном берет на себя работу веб-службы, когда она не работает, и регистрирует все, чтобы данные не терялись.

  • Когда все в порядке, приложение A будет отправлять данные на ваш веб-сервис
  • Как только это соединение разрывается, вы сразу же запускаете приложение B (здесь очевидно, почему бы не оставить приложение B запущенным как отказоустойчивое)
  • Приложение A подключается к приложению B и передает то, что было буферизовано
  • Приложение A продолжает пытаться восстановить соединение с вашей веб-службой, и после его резервного копирования приложение B запросит остановку

Если проблема, с которой вы сталкиваетесь, не похожа на это, пожалуйста, предоставьте более конкретное описание того, что должны делать приложения A и B. Я буду более чем рад помочь.

0 голосов
/ 03 октября 2009

Проверьте, подключен ли кабель, если это так, пропингуйте ваше интернет-соединение с любым хостом как google.com.

0 голосов
/ 03 октября 2009
  1. Первый запуск: попросить пользователя ввести параметры сети, например настройки прокси. Сохранить эту информацию.

  2. Следующие запуски: Используйте эти настройки для проверки подключения к Интернету. Вы можете просто выполнить поиск DNS.

  3. Если результаты отрицательные, попросите пользователя проверить настройки.

0 голосов
/ 03 октября 2009

В своем коде вы должны проверить, существует ли интернет-соединение, используя сокет, чтобы открыть соединение с веб-сайтом.

0 голосов
/ 03 октября 2009

ping google.com

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