除了更改路由表之外,Windows中是否有可靠的方法强制新创建的套接字使用特定的网络接口?我知道接口的IP地址bind()
并不能保证这一点。
答案 0 :(得分:16)
(好的第二次幸运..)
仅供参考,这里有另一个问题perform connect() on specific network adapter沿着同样的路线......
Windows XP和WindowsServer®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,而后者又是基于IP的 在路由表上。对bind()的调用 不会影响卡的选择 无论如何。
这与某事有关 称为“弱端系统”的东西 (“弱E / S”)模型。 Vista改为了 强E / S模型,所以问题可能 在Vista下不会出现。但所有先前的 Windows版本使用弱E / S. 模型。
弱E / S模型,它是 路由表决定哪张卡 用于a中的传出流量 多宿主系统。
看看这些线程是否提供了一些 洞察:
“多宿主上的本地套接字绑定 Windows XP中的主机无法正常工作 http://www.codeguru.com/forum/showthread.php?t=452337
“如何将端口连接到指定的端口 网卡?“在 http://www.codeguru.com/forum/showthread.php?t=451117。 这个帖子提到了 CreateIpForwardEntry()函数,其中 (我认为)可以用来创建一个 在路由表中输入以便全部 指定的传出IP流量 服务器通过指定路由 适配器。
“使用2个以太网卡” http://www.codeguru.com/forum/showthread.php?t=448863
“多宿主上的奇怪绑定行为 系统“在 http://www.codeguru.com/forum/showthread.php?t=452368
希望有所帮助!