一个套接字如何知道使用哪个networking接口控制器?

我是networking编程领域的一名大学生,所以我的问题看起来很愚蠢,但请耐心等待。

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

(如果您觉得投票赞成,@Sheeléf的回答值得我的赞赏。)

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

如果你绑定,你可以绑定到一个特定的IP地址对应的机器的接口,或者你可以绑定到0.0.0.0,在这种情况下,套接字将监听所有接口。

如果您连接了一个未绑定的套接字,那么机器的路由表与目标IP地址一起将确定连接请求发出的接口。

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

我从Linux的angular度来写这篇文章,但我认为它适用于任何地方。

当套接字被绑定时做出决定。 当bind被调用时,你指定的地址决定了套接字将要监听的接口。 (甚至所有的接口)

即使你不使用bind ,当你connect时候也会隐式地发生。 目的地在路由表中查找,该路由表必须包含到目的地networking的路由。 该路由还包含使用的接口,可以select甚至指定源地址。 如果没有指定源地址,则接口的主地址被占用。

实际上,您可以使用bind connect ,强制您的传出连接使用特定的地址和端口。 一个套接字必须总是有这两位信息,所以即使你不这样做,主地址也会被使用,并且一个随机端口被选中。

我并不确定哪种方法是最好的,但是对于Shtééf提出的bind() – before-connect()方法,有一个替代理论。 这是使用setsockopt()与SO_BINDTODEVICE。 请参阅: http : //codingrelic.geekhold.com/2009/10/code-snippet-sobindtodevice.html