我的理解是,如果套接字不绑定本地地址(或绑定到INADDR_ANY
),并且不调用connect()
设置远程地址/端口,则无法阻止单播数据包传递到多播侦听套接字,或者反之反之亦然,因为当数据包到达 UDP 层时剩下的唯一检查是端口号匹配(同样,因为其他标准(例如远程/本地地址)都为零)。我能想到的假设场景是这样的:
- 在具有一个接口的计算机上,主 IP 地址是 IP_ADDR
- 套接字 A 监听 UDP 多播地址 MULTICAST_IP_A,端口号为 PORT_A
- 套接字 B 在 PORT_B 上侦听 UDP 单播
那么以下陈述是否正确?
- 发送到组地址 MULTICAST_IP_A(端口号 PORT_B)的多播数据包将被传递到套接字 B
- 发送到 IP_ADDR:PORT_A 的单播数据包将被传递到套接字 A
我查看了Linux IPv4源代码,到目前为止似乎会发生上述两种情况,例如,__udp_is_mcast_sock()
true
即使为空也会返回inet->mc_list
,因为inet_create()
设置inet->mc_all
为1
.但我不是专家,想听听有人验证/无效这些声明,也许还可以提供一些代码指示。谢谢!
答案1
请注意,如果本地地址不是多播的,udp_is_mcast_sock() 将返回 false(请参阅ip_mc_sf_允许)。
对于这两个问题,这篇文章可能会有所帮助:绑定多播 (UDP) 套接字意味着什么?
对于情况1。
- 组播数据包发送到组地址 MULTICAST_IP_A,端口号为 PORT_B将不会被传送到套接字B
对于情况2。
- 单播数据包发送到 IP_ADDR:PORT_A将要被传递到套接字 A。UDP 多播套接字将绑定在 0.0.0.0 上,这就是原因。您可以启动服务器并运行
netstat -aun
来查看,尽管您可能已经在端口 5353 (avahi/mdns) 上拥有一个服务器。
您可以使用 python 多播客户端/服务器程序检查这种情况和其他情况这个帖子。要模拟单播客户端/服务器行为,您可以使用nc
(netcat)。