Как узнать, какой сетевой адаптер подключен к Интернету?

StackOverflow https://stackoverflow.com/questions/38864

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Мое текущее решение включает использование IPHelper's "GetBestИнтерфейс" и предоставив ей IP-адрес "0.0.0.0".

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top