Есть ли надежный способ в Windows, помимо изменения таблицы маршрутизации, чтобы заставить вновь созданный сокет использовать определенный сетевой интерфейс? Я понимаю, что bind()
к IP-адресу интерфейса не гарантирует этого.
Использование определенного сетевого интерфейса для сокета в окнах
Ответ 1
(Ok второй раз повезло..)
FYI есть еще один вопрос здесь выполнить connect() на конкретном сетевом адаптере по тем же строкам...
Согласно The Cable Guy
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-адрес назначения, который, в свою очередь, основан в таблице маршрутизации. Вызов bind() не повлияет на выбор карты в любом случае.
Это как-то связано с что-то называемое "Слабая конечная система" ( "Слабая E/S" ). Vista изменена на сильная модель E/S, поэтому проблема может не возникает в Vistastrong > . Но все предыдущие версии 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-трафик с указанным сервер маршрутизируется через указанный адаптер.
"Работа с двумя картами Ethernet" в http://www.codeguru.com/forum/showthread.php?t=448863
"Странное поведение привязки на многочленных системы" в http://www.codeguru.com/forum/showthread.php?t=452368
Надеюсь, что это поможет!