我在多播范围内设置了一个具有相同远程地址的UDP套接字。一个发送到224.2.0.6:6666,另一个发送到224.2.0.7:6666。我依靠Linux路由表来确定通过哪个接口发送数据包。
在这两种情况下,我在开头设置一个套接字,设置我的sockopts,然后执行sendto()
。我没有设置特定的IP_MULTICAST_IF
。
但是,在第一种情况下,我还会在第一个connect()
之前执行sendto()
。
在connect()
情况下,操作系统忽略环回路由并通过默认路由和接口发送所有数据包。
在非connect()
情况下,操作系统会遵循环回路由,所有数据包都通过环回接口发送。
为什么socket()
- connect()
- sendto()
通过lo
的路由导致操作系统忽略它,而只是socket()
- {{ 1}}通过sendto()
的路由正确路由?
我的lo
:
ip route
请注意,如果路由是环回接口,则此问题仅存在 。如果我通过"真实"设置路线interface - actual,macvlan,dummy,whatever - 然后224.2.0.0/16 via 127.0.0.1 dev lo
default via 172.16.5.1 dev eth0
和connect()
同等地尊重路线并且工作正常。
更新:
原始代码。格式化被搞砸了,因为它是对其他人的代码的编辑,试图手动清理,为这个烂摊子道歉:
sendto()