一个套接字如何知道使用哪个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
- centos:另一个MySQL守护程序已经在相同的unix套接字下运行
- 使用.Net 4.5asynchronousfunction进行套接字编程
- C套接字sockaddr和sockaddr_storage背后的推理
- mysqld_safe UNIX套接字文件的目录'/ var / run / mysqld'不存在
- 如何在python的套接字recv方法上设置超时?
- 如何解决java.net.SocketException:损坏的pipe道?
- Android持久套接字连接规则
- 为什么在不尝试I / O的情况下,不可能检测到TCP套接字已被对方正常closures?
- 如何检测远程侧socketsclosures?