为什么UDP连接呼叫忽略环回组播路由,但没有连接的sendto有效?

时间:2015-08-03 16:08:57

标签: c linux sockets

我在多播范围内设置了一个具有相同远程地址的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()

0 个答案:

没有答案