Использование определенного сетевого интерфейса для сокета в Windows - PullRequest
19 голосов
/ 14 января 2010

Есть ли надежный способ в Windows, кроме изменения таблицы маршрутизации, заставить вновь созданный сокет использовать определенный сетевой интерфейс? Я понимаю, что bind() на IP-адрес интерфейса не гарантирует этого.

1 Ответ

17 голосов
/ 17 января 2010

(Хорошо, второй раз повезло ..)

К вашему сведению, здесь есть еще один вопрос выполнить connect () на определенном сетевом адаптере в том же ключе ...

Согласно Кабельщик

Windows XP и Windows Server® 2003 использовать слабую модель хоста для отправки и получает для всех интерфейсов IPv4 и модель сильного хоста для отправки и получает для всех интерфейсов IPv6. Вы не могу настроить это поведение. Стек TCP / IP следующего поколения в Windows Vista и Windows Server 2008 поддерживает сильные хосты и получает как для IPv4, так и для IPv6 по умолчанию на всех интерфейсах, кроме Teredo туннельный интерфейс для Реле Teredo для конкретного хоста.

Так что ответить на ваш вопрос (правильно, на этот раз) в Windows XP и Windows Server 2003 IP4 нет, а для IP6 да. А для Windows Vista и Windows 2008 да (кроме определенных обстоятельств).

Также от http://www.codeguru.com/forum/showthread.php?t=487139

В Windows вызов bind () влияет выбор карты только входящего трафика, не исходящий трафик. Таким образом, на клиент работает в многодомной системе (то есть более одной интерфейсной карты), это сетевой стек, который выбирает карта для использования, и это делает его выбор основан исключительно на IP-адрес назначения, который в свою очередь основан на столе маршрутизации. Призыв связать () не повлияет на выбор карты любым способом.

Это как-то связано с то, что называется «Слабая конечная система» ("Слабая E / S") модель. Vista изменена на сильная модель E / S, поэтому проблема может не возникает под Vista . Но все до версии Windows использовали слабый E / S модель.

При слабой модели E / S это таблица маршрутизации, которая решает, какая карта используется для исходящего трафика в многосетевая система.

Посмотрите, предлагают ли эти темы некоторые понимание:

"Локальное связывание сокетов на многосетевых хост в Windows XP не работает http://www.codeguru.com/forum/showthread.php?t=452337

"Как подключить порт к указанному Сетевая карта? "В http://www.codeguru.com/forum/showthread.php?t=451117. В этой теме упоминается Функция CreateIpForwardEntry (), которая (Я думаю) можно использовать для создания запись в таблице маршрутизации, чтобы все исходящий IP-трафик с указанным сервер маршрутизируется через указанный адаптер.

«Работа с 2 картами Ethernet» в http://www.codeguru.com/forum/showthread.php?t=448863

"Странное поведение связывания на многосетевом система "на http://www.codeguru.com/forum/showthread.php?t=452368

Надеюсь, это поможет!

...