假设我有两个网络接口:
-
eth0
与地址10.0.0.1
-
eth1
与地址192.168.0.1
使用route
或ip route add
我已将其设置为路由:
- 要
eth0
的所有地址 -
1.2.3.4
只eth1
所以发给1.2.3.4
的数据包应该路由到eth1
,其他所有东西都路由到eth0
。
然后,我创建一个UDP套接字并使用bind()
将其本地地址设置为192.168.0.1
。然后我向1.2.3.4
发送一个数据包。
是否会根据路由表或eth0
通过eth1
发送它,因为它绑定到该 IP 地址?我试过了,它似乎是eth1
发送的.
有没有办法强制套接字使用 eth0
,它具有到达目的地的有效路由,但不是最具体的规则?我知道SO_BINDTODEVICE,但宁愿避免在 C 代码中使用接口名称。
对于套接字,如果您希望内核及其路由表使用任何可用端口为您选择最佳接口,则不必在发送数据报套接字之前调用bind()
。
如果确实绑定了套接字,它将绑定到具有该特定 IP 地址的网络设备。但是,如果数据包无法从该网络设备到达目标地址,这有意义吗?