标题:基于Qt实现onvif设备端代码/onvif设备模拟器/记一个linux上组播失败的问题解决
作者:liudianwu
日期:2025-08-31 10:12
内容:
## 一、前言说明
之前已经实现了完整的onvif设备模拟器代码,主要是在windows上测试的,按照之前的经验,代码是已经做了其他系统的兼容,估计linux系统运行也是没有问题的,有时候不亲测测试还真不知道什么情况,比如这次就翻车了,用户说在linux上只能单播不能广播,组播权限也都是开启的,而且抓包也能抓到对应组播的包,说明环境没有问题,这是最大的前提,如果抓包也抓不到就需要检查环境问题。那问题出在哪里呢,组播用的是qudpsocket是监听的,而且代码在windows上也完全正常,估计是某个细节导致的,好在现在AI非常发达,问了问豆包,给出一段代码测试,和我自己写的代码,几乎一样,但是他的代码运行,居然可以收到组播包,原来有个区别,udpSocket->bind(QHostAddress::AnyIPv4, 6000),而我用的udpSocket->bind(QHostAddress("192.168.0.110"), 6000),因为只有一个网卡,所以不涉及到多网卡指定的问题,AnyIPv4最多就是还多了个127.0.0.1的内部虚拟的网卡,根本不会经过实体网卡,但是恰恰是这个小细节,导致了组播失效。
原来windows和linux的组播机制有点不一样,linux上组播数据的传递依赖于组播组地址(如239.255.43.21),而非接收端的本地 IP 地址。当你绑定到具体 IP(如192.168.0.110)时,操作系统会对接收的数据包进行严格过滤,只有目标 IP 是192.168.0.110的单播数据包会被接收,目标 IP 是组播地址(如239.255.43.21)的数据包会被过滤掉,因为它不匹配绑定的具体 IP。而绑定QHostAddress::AnyIPv4(等价于0.0.0.0)时,操作系统会接收所有 IP 地址(包括单播、组播)的数据包,此时组播数据才能被QUdpSocket捕获。但是windows上默认不会去匹配具体绑定的IP,只要加入了组播就可以。
## 二、效果图
## 三、相关地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 文件地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_v ..