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

Posted

技术标签:

【中文标题】在 Windows 中为套接字使用特定的网络接口【英文标题】:Using a specific network interface for a socket in windows 【发布时间】:2011-01-05 03:33:52 【问题描述】:

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

【问题讨论】:

【参考方案1】:

(好吧,第二次幸运..)

仅供参考,这里还有另一个问题perform connect() on specific network adapter 与此相同...

根据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 模型,所以问题可能 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 个以太网卡”在 http://www.codeguru.com/forum/showthread.php?t=448863

“多宿主的奇怪绑定行为 系统”在 http://www.codeguru.com/forum/showthread.php?t=452368

希望有帮助!

【讨论】:

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

以上是关于在 Windows 中为套接字使用特定的网络接口的主要内容,如果未能解决你的问题,请参考以下文章

Windows、Linux和路由器的网络子接口-虚拟IP

如何在 Windows 控制台中为特定像素着色

如何使用 Azure 在 Windows Phone 8 中为特定设备发送推送通知

winsock是啥,是一门语言还是一个文件?

《计算机网络原理》网络应用通信基本原理

linux网络配置