Qt 无线局域网内 UDP 广播只能单向发送或接收
1. 实验来源
《Qt Creator快速入门 第三版》第18章 18.3 UDP 实验,udpsender(广播) 和 udpreceiver。
2. 实验配置
两台主机 PC1 和 PC2 接入同一无线路由器。
3. 测试
3.1 同一主机上测试发送和接收
使用 udpsender 广播,使用 udpreceiver 可以接收。
3.2 两台主机一接一发
PC1 和 PC2 分别使用 UDP 调试助手监听对方端口,相互发送和接收都正常。
PC1 使用 udpsender 广播,PC2 使用 udpreceiver 可以接收。
PC2 使用 udpsender 广播,PC1 使用 udpreceiver 无法接收。
4. 问题讨论
为什么两台主机无法进行双向广播?
来自网络的相关信息:
- 禁用主机上的虚拟网络设备;
- 两台主机端口号要一致;
- 防火墙;
- 有线网络可以广播,无线网络只能进行 x.x.x.255 无法进行全域广播;
所以,排除前三项列出的问题,问题应该出在无线路由器对全域广播的限制上。也就是说通过无线路由器搭建的局域网无法进行广播。至于有线局域网,因为没有设备没有进行实验。
如果还是希望在无线局域网内进行广播,可以对 IP 地址进行限制:
// 全域广播使用 QHostAddress::Broadcast 即 255.255.255.255
sender->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, port);
// 限制地址域 QHostAddress("192.168.1.255"),需要将局域网内设备 IP 地址改成该段内的地址
sender->writeDatagram(datagram.data(), datagram.size(), QHostAddress("192.168.1.255"), port);