在 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 中为套接字使用特定的网络接口的主要内容,如果未能解决你的问题,请参考以下文章