如果一台计算机有多个网卡,所有网卡都连接到不同的网络并正常运行,当我们打开一个套接字时,操作系统如何确定该套接字使用哪个网卡?套接字API是否允许我们显式指定要使用的NIC?
(如果你觉得倾向于投票,@Shtééf的答案应该比我的更多。)
这取决于您是连接还是绑定。
如果绑定,则可以绑定到与计算机的某个接口对应的特定IP地址,也可以绑定到0.0.0.0,在这种情况下,套接字将侦听所有接口。
如果连接未绑定的套接字,则计算机的路由表与目标IP地址一起将确定连接请求所在的接口。
可以绑定套接字然后连接它。在这种情况下,套接字在进行连接时将根据绑定调用保持绑定。 (感谢@RemyLebeau指出这一点。)
我是从Linux的角度写这个,但我认为它适用于所有地方。
在绑定套接字时做出决定。调用bind
时,您指定的地址决定了套接字将侦听的接口。 (甚至所有接口。)
即使你不使用bind
,它也会在你connect
时隐式发生。在路由表中查找目标,该路由表必须包含到目标网络的路由。该路由还包含要使用的接口,甚至可以指定源地址。如果未指定源地址,则采用接口的主地址。
您实际上可以将bind
与connect
一起使用,以强制您的传出连接使用特定的地址和端口。套接字必须始终具有这两位信息,因此即使不这样做,也会使用主地址并选择随机端口。
我不确定哪种方法最好,但是对于shtééf提出的bind() - before-connect()方法有另一种理论。它是使用带有SO_BINDTODEVICE的setsockopt()。见:http://codingrelic.geekhold.com/2009/10/code-snippet-sobindtodevice.html