Интеллектуальные методы обнаружения подключения к Интернету на устройстве со встроенным Linux
-
13-09-2019 - |
Вопрос
Наша команда занимается разработкой устройства Internet Media на базе Linux 2.6.В настоящее время мы определяем, установлено ли подключение к Интернету (через проводной интерфейс Ethernet), проверяя связь www.google.com.
Некоторые сети, в которых мы тестировали устройство, не поддерживают пересылку пакетов ICMP, поэтому код нашего приложения в этом случае ошибочно сообщает, что Интернет недоступен.
Кто-нибудь знает более совершенный подход к определению доступности подключения к Интернету через /dev/eth0, не прибегая к проверке связи с известным сервисом?
Решение
Как парень, написавший ответ, на который ссылается ChristopheD, я бы здесь не использовал такой подход.Это сработало для другого вопроса, потому что в этом случае мы проверяли наличие прямого соединения PPP с текущей машины - в этом случае вы подключены к произвольной сети, которая может иметь или не иметь маршрут по умолчанию, независимо от более широкого подключения к Интернету.
Поскольку для вашего приложения вам необходимо глобальное подключение DNS, я бы проверил это — найдите адрес, который, как вы знаете, всегда будет существовать — например, NS
введите запрос для com.
домен.Используйте достаточно длительный тайм-аут и/или повторите попытку несколько раз, прежде чем сдаться.Что-то вроде этого:
dig NS +aaonly com.
Проигнорируйте выходные данные и проверьте значение выхода — 0 указывает, что поиск смог связаться с корневыми серверами, а все остальное — нет.
Другие советы
В конечном итоге вы хотите, чтобы устройство могло использовать Интернет для каких-то полезных функций.Если существует четко определенный сервер, к которому обычно подключается устройство, было бы полезно отправить на него запрос.
Между «ничего» и «полезной функцией» есть много шагов, и вы потенциально можете проверить любой из них как некоторую меру «связности»:
- Кабель Ethernet подключен (или установлено соединение PPP, или Wi-Fi, независимо от того, какой у вас нижний уровень)
- Адрес, назначенный DHCP-сервером (если применимо)
- Шлюз по умолчанию работает
- DNS-сервер отвечает
- Целевой сервер отвечает (возможно, не ICMP-пинг, а небольшой HTTP-запрос или любой другой протокол, который вы можете использовать)
В зависимости от того, насколько сообразительный ваш клиент или если вам нужна полезная ошибка/диагностика, о которой он может сообщить в службу технической поддержки, может быть полезно обнаружить все это.
Также может быть полезно иметь возможность использовать трассировку в качестве диагностического инструмента.