套接字如何知道要使用哪个网络接口控制器?

问题描述 投票:44回答:3

如果一台计算机有多个网卡,所有网卡都连接到不同的网络并正常运行,当我们打开一个套接字时,操作系统如何确定该套接字使用哪个网卡?套接字API是否允许我们显式指定要使用的NIC?

sockets networking
3个回答
29
投票

(如果你觉得倾向于投票,@Shtééf的答案应该比我的更多。)

这取决于您是连接还是绑定。

如果绑定,则可以绑定到与计算机的某个接口对应的特定IP地址,也可以绑定到0.0.0.0,在这种情况下,套接字将侦听所有接口。

如果连接未绑定的套接字,则计算机的路由表与目标IP地址一起将确定连接请求所在的接口。

可以绑定套接字然后连接它。在这种情况下,套接字在进行连接时将根据绑定调用保持绑定。 (感谢@RemyLebeau指出这一点。)


50
投票

我是从Linux的角度写这个,但我认为它适用于所有地方。

在绑定套接字时做出决定。调用bind时,您指定的地址决定了套接字将侦听的接口。 (甚至所有接口。)

即使你不使用bind,它也会在你connect时隐式发生。在路由表中查找目标,该路由表必须包含到目标网络的路由。该路由还包含要使用的接口,甚至可以指定源地址。如果未指定源地址,则采用接口的主地址。

您实际上可以将bindconnect一起使用,以强制您的传出连接使用特定的地址和端口。套接字必须始终具有这两位信息,因此即使不这样做,也会使用主地址并选择随机端口。


0
投票

我不确定哪种方法最好,但是对于shtééf提出的bind() - before-connect()方法有另一种理论。它是使用带有SO_BINDTODEVICE的setsockopt()。见:http://codingrelic.geekhold.com/2009/10/code-snippet-sobindtodevice.html

© www.soinside.com 2019 - 2024. All rights reserved.