Как вы узнаете, какой сетевой адаптер подключен к Интернету? - PullRequest
4 голосов
/ 02 сентября 2008

Рассмотрим следующую настройку: ПК с Windows с интерфейсом LAN и интерфейсом WiFi (стандарт для любого нового ноутбука). Каждый из интерфейсов может быть подключен или отключен от сети. Мне нужен способ определить, какой из адаптеров подключен к Интернету, в частности, если они оба подключены к разным сетям, один с подключением к Интернету, а другой - без.

Мое текущее решение включает использование функции IPHelper « GetBestInterface » и предоставление ему IP-адреса «0.0.0.0».

Есть ли у вас какие-либо другие решения этой проблемы?

После некоторых ответов позвольте мне уточнить:

  • Мне это нужно, потому что у меня есть продукт, который должен выбрать, к какому адаптеру привязываться. У меня нет возможности контролировать настройку сети или хоста, на котором будет работать продукт, и поэтому мне нужно как можно более надежное решение с минимальным количеством предположений.
  • Мне нужно сделать это в коде, так как это часть продукта.

@ Крис Упчерч: Это делает меня зависимым от того, что google.com работает (обычно это не проблема), и от любого персонального брандмауэра, который может быть установлен для разрешения проверки связи.

@ Till: Как сказал Стив Мун, полагаться на адрес адаптера довольно рискованно, потому что вы делаете много предположений о настройке внутренней сети.

@ Стив Мун: Глядя на таблицу маршрутизации, кажется хорошей идеей, но вместо того, чтобы самому применять логику маршрутизации, я пытаюсь использовать «GetBestInterface», как описано выше. Я верю, что это должно именно то, что вы изложили в своем ответе, но я не совсем уверен. Причина, по которой я не хочу реализовывать свою собственную «логику маршрутизации», заключается в том, что есть большая вероятность, что я ошибусь, чем если бы я использовал библиотеку / API, написанную и протестированную более «жесткими» сетевиками. *

Ответы [ 8 ]

4 голосов
/ 02 сентября 2008

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

К счастью, для 99,9% домашних пользователей это подойдет. Они вряд ли будут иметь большую часть таблицы маршрутизации, и GetBestInterface автоматически предпочтет проводной по беспроводной - так что вы должны быть хорошими. Добавьте опцию переопределения для .1% случаев, которые вы облажались, и назовите это день.

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

Опять же, я не уверен, что вы планируете делать с этим адаптером, "подключенным к Интернету", поэтому это может не иметь большого значения.

1 голос
/ 07 сентября 2008

Я бы посмотрел на таблицу маршрутизации. Какой бы ни был 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; ранее Спринтом, если я правильно помню.

1 голос
/ 05 сентября 2008

Видимо, в Vista появились новые интерфейсы, которые позволяют запрашивать подключение к Интернету и многое другое. Взгляните на NLM Interfaces и, в частности, INetworkConnection - вы можете специально запросить, имеет ли сетевое подключение подключение к Интернету, используя метод GetConnectivity.

См. Также: Информация о сети в Windows Vista К сожалению, это доступно только в Vista, поэтому для XP мне пришлось бы сохранить исходную эвристику.

0 голосов
/ 16 сентября 2008

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

0 голосов
/ 02 сентября 2008

Запустив трассировку на какой-либо публичный сайт покажет вам. Конечно, может быть несколько интерфейсов, которые бы вас туда привели.

0 голосов
/ 02 сентября 2008

Посмотрите на таблицу маршрутизации? Обычно, если вы не маршрутизируете между сетями в 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 отправляет какой-либо трафик, это было бы отстойно, если бы федералы сломали вашу дверь ...:)

0 голосов
/ 02 сентября 2008

Пуск> Выполнить> cmd.exe (работает в XP и Vista): ipconfig /all

Отображает всю информацию об интерфейсах на вашем компьютере. «Публичный» интерфейс должен иметь публичный IP-адрес. Для начала не должно быть 192.168.x.x или 10.x.x.x:)

0 голосов
/ 02 сентября 2008

Пингуйте google.com через каждый сетевой адаптер.

...