Как вы узнаете, какой сетевой адаптер подключен к Интернету?
Рассмотрим следующую настройку: ПК с Windows с интерфейсом LAN и интерфейсом WiFi (стандарт для любого нового ноутбука). Каждый из интерфейсов может быть подключен или отключен от сети. Мне нужен способ определить, какой из адаптеров подключен к Интернету, в частности, если они оба подключены к разным сетям, один с подключением к Интернету, а другой - без.
Мое текущее решение заключается в использовании функции " GetBestInterface " IPHelper и предоставлении ему IP-адреса "0.0.0.0".
Есть ли у вас какие-либо другие решения, которые вы могли бы предложить для этой проблемы?
Следуя некоторым ответам, позвольте мне уточнить:
- Мне это нужно, потому что у меня есть продукт, который должен выбрать, к какому адаптеру привязываться. У меня нет возможности контролировать настройку сети или хоста, на котором будет работать продукт, и поэтому мне нужно как можно более надежное решение с минимально возможным количеством предположений.
- Мне нужно сделать это в коде, так как это часть продукта.
@Chris Upchurch: Это делает меня зависимым от того, что google.com работает (обычно это не проблема), и от любого персонального брандмауэра, который может быть установлен для пинга.
@ До: Как сказал Стив Мун, полагаться на адрес адаптера довольно рискованно, потому что вы делаете много предположений о настройке внутренней сети.
@Steve Moon: Глядя на таблицу маршрутизации, это хорошая идея, но вместо того, чтобы самому применять логику маршрутизации, я пытаюсь использовать "GetBestInterface", как описано выше. Я верю, что это должно именно то, что вы изложили в своем ответе, но я не совсем уверен. Причина, по которой я не желаю реализовывать свою собственную "логику маршрутизации", заключается в том, что есть большая вероятность, что я ошибусь, чем если бы я использовал библиотеку /API, написанный и протестированный более "жесткими" сетевиками.
8 ответов
Технически, нет "подключен к Интернету". На самом деле вопрос в том, какой интерфейс можно перенаправить на нужный адрес. Прямо сейчас вы запрашиваете "маршрут по умолчанию" - тот, который применяется, если нет определенного маршрута к месту назначения. Но вы игнорируете любые конкретные маршруты.
К счастью, для 99,9% домашних пользователей это подойдет. Они вряд ли будут иметь большую часть таблицы маршрутизации, и GetBestInterface автоматически предпочтет проводную связь по беспроводной - так что вы должны быть хорошими. Добавьте опцию переопределения для.1% случаев, которые вы облажались, и назовите это день.
Но для корпоративного использования вы должны использовать GetBestInterface для определенного места назначения - в противном случае у вас возникнут проблемы, если кто-то находится в той же локальной сети, что и пункт назначения (что означает, что вы должны использовать "внутренний" интерфейс, а не "внешний").) или имеет определенный маршрут к пункту назначения (например, моя внутренняя сеть может взаимодействовать с сетью пункта назначения).
Опять же, я не уверен, что вы планируете делать с этим адаптером, "подключенным к Интернету", так что это может не иметь большого значения.
Я бы посмотрел на таблицу маршрутизации. Какой бы ни был NIC с маршрутом 0.0.0.0 И включен И имеет самый низкий показатель, это номер, который в настоящее время отправляет пакеты в Интернет.
Так что в моем случае, самый лучший из них - "интернет-ник".
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.0.0.10 10.0.0.51 20
0.0.0.0 0.0.0.0 10.0.0.10 10.0.0.50 25
(much other stuff deleted)
Другой альтернативой является ping или GetBestInterface 4.2.2.2 - это старый и почтенный DNS-сервер, в настоящее время поддерживаемый GTEI; ранее Спринтом, если я правильно помню.
По-видимому, в Vista появились новые интерфейсы, которые позволяют запрашивать подключение к Интернету и многое другое. Взгляните на интерфейсы NLM и, в частности, на INetworkConnection - вы можете специально запросить, имеет ли сетевое соединение подключение к Интернету, используя метод GetConnectivity.
См. Также: Осведомленность о сети в Windows Vista. К сожалению, это доступно только в Vista, поэтому для XP мне пришлось бы сохранить исходную эвристику.
Если посмотреть с точки зрения сети, любой из них может быть в любое время подключен к "Интернету". Если такие вещи, как протокол связующего дерева, включены на коммутаторе, вы можете обнаружить, что то, что, возможно, изначально было картой маршрутизации, больше не может быть.
Пуск> Выполнить> cmd.exe (это работает в XP и Vista): ipconfig /all
Это отображает всю информацию об интерфейсах на вашем компьютере. "Открытый" интерфейс должен иметь публичный IP-адрес. Для начала, это не должно быть 192.168.xx или 10.xxx:)
Посмотрите на таблицу маршрутизации? Обычно, если вы не маршрутизируете между сетями в Windows (что возможно, но необычно для клиентского компьютера в наши дни), интерфейс, который содержит маршрут по умолчанию, будет иметь подключение к Интернету.
В вашем вопросе не указано, почему или с чем вы это делаете, поэтому я не могу предоставить какие-либо подробности. Инструмент командной строки "route" может помочь, но, вероятно, есть библиотеки для любого языка программирования, который вы используете для просмотра таблицы маршрутизации.
Вы не можете полагаться на IP-адрес интерфейса (например, предполагая, что адрес RFC-1918 [192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8] не является Интернетом), так как большинство сайтов имеют какая-то NAT-установка брандмауэра или прокси-сервера, и интерфейс "Интернет" действительно находится на "частной" сети, которая выводит вас в Интернет.
ОБНОВЛЕНИЕ: Судя по вашей дальнейшей информации, похоже, у вас есть достойное решение. Я не уверен в выборе 0.0.0.0, так как это граничный случай для IP-адреса - может быть, подходит для вашего конкретного сочетания платформы / языка. Звучит (из описания API), что вы могли бы просто указать адрес, так почему бы не узнать какой-нибудь адрес в Интернете, например IP-адрес вашего веб-сайта, или что-то более случайное, например 65.66.67.68? Просто убедитесь, что вы не выбрали один из адресов rfc-1918, или диапазон локального хоста (127.0.0.0/8), или многоадресную рассылку, любой другой зарезервированный диапазон и любой адрес, который разрешается в.mil или.gov (пока он не не похоже, что getbestinterface отправляет какой-либо трафик, было бы плохо, если бы федералы сломали вашу дверь...:)
Запуск traceroute на каком-либо общедоступном сайте покажет вам. Конечно, может быть больше, чем один интерфейс, который доставит вас туда.