在windows中为套接字使用特定的网络接口

在windows中为套接字使用特定的网络接口,windows,networking,binding,sockets,bind,Windows,Networking,Binding,Sockets,Bind,在Windows中,除了更改路由表外,是否有可靠的方法强制新创建的套接字使用特定的网络接口?我理解,bind()到接口的IP地址并不能保证这一点。(第二次确认) 仅供参考这里还有一个同样的问题 据 Windows XP和Windows Server®2003 使用弱主机模型进行发送和发送 接收所有IPv4接口和 发送和发送的强主机模型 接收所有IPv6接口的数据。你 无法配置此行为。这个 中的下一代TCP/IP堆栈 Windows Vista和Windows Server 2008 支持强主机发

在Windows中,除了更改路由表外,是否有可靠的方法强制新创建的套接字使用特定的网络接口?我理解,
bind()
到接口的IP地址并不能保证这一点。

(第二次确认)

仅供参考这里还有一个同样的问题

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,是(某些情况除外)

也来自

在Windows上,对bind()的调用会影响 卡选择仅限传入流量, 不是传出的流量。因此 在多主机系统中运行的客户端 (即多个接口卡), 是网络堆栈选择了 要使用的卡,并使其 选择完全基于 目标IP,而目标IP又是基于 在路由表上。对bind()的调用 不会影响卡的选择 无论如何

这跟我有点关系 被称为“弱端系统”的东西 (“弱E/S”)模型Vista已更改为 强大的E/S模型,因此问题可能 不会在Vista下出现。但所有之前 Windows版本使用弱E/S 模型

对于弱E/S模型,它是 决定哪张卡的路由表 用于中的传出流量 多宿系统

看看这些线程是否提供了一些 见解:

“多主机上的本地套接字绑定” Windows XP中的主机“在”时不工作

“如何将端口连接到指定的 网络卡?“在 . 此线程提到 CreateIpForwardEntry()函数,该函数 (我认为)可以用来创建一个 在路由表中输入,以便所有 具有指定IP地址的传出IP流量 服务器通过指定的 适配器

“使用2个以太网卡”在

“多宿网络上奇怪的绑定行为” 系统“在


希望有帮助

谢谢,除非我遗漏了什么,否则这两个答案都不相关,因为windows与BINDTODEVICE无关。尽管我没有证据,但我怀疑你的总结是正确的!用更好的信息更新了我的答案-对不起!请注意,弱主机模型和强主机模型不会影响从套接字发送的流量的路由方式。即,强主机模型确保离开网络适配器的流量使用该适配器分配的IP地址,但不影响主机中的网络堆栈如何选择要实际使用的传出适配器。这实际上在上面的“有线电视人”链接以及Wikipedia上都有解释:在某些协议中,如icmpv6邻居发现,可以发送未指定地址(即
)作为源的数据包。例如,路由器请求消息可能具有(dst
ff02::2
(链接本地所有路由器)和作为源的
)。如果在windows上打开一个原始IPv6套接字并发送这样的数据包,它会在所有接口上消失吗?这种情况是否意味着除了强制src成为接口的链路本地IP之外,没有其他方法限制输出接口?因此,11年后,最好的答案仍然是“不可能”?