关于QT UDP组播的两个问题

UDP组播时最好不要提客户端/服务端的概念,而是提发送端/接收端的概念,避免出现逻辑理解混乱。

大家在使用QT UDP时,可能会出现下面的情况:

1.接收不到数据

1.1 代码不对

我看有些文章会这样写:

m_udpSocket = new QUdpSocket();
m_udpSocket->bind(QHostAddress::AnyIPv4,8083,QUdpSocket::ShareAddress);
//m_udpSocket->setSocketOption(QAbstractSocket::MulticastLoopbackOption,0); //表示禁止本机接收
m_udpSocket->joinMulticastGroup(m_McastAddr);
connect(m_udpSocket,SIGNAL(readyRead()),this ,SLOT(processPendingDatagrams()));
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

在接收端加入语句

m_udpSocket->setSocketOption(QAbstractSocket::MulticastLoopbackOption,0);
   
   
  • 1
  • 1

是无法接收到数据的,需要注释掉。

bind Ip时使用QHostAddress::AnyIPv4是必要的。

1.2 Windows能接收,Linux接收不到

以中标麒麟举例,它的防火墙中默认情况下,我们设置的端口号,是没有权限的,所以要在防火墙中放开限制;那么其他Linux操作系统可能也是这种问题。

2.编译错误,报socket在不同的线程使用

一般应用中我们会在线程中接收数据,然后用另一个线程解析数据,以达到防止主线程卡死的问题;无论是继承QThread重载run函数;还是将接收对象moveToThread,都需要注意是在主线程还是在子线程中new的QUdpSocket;因为QUdpSocket是
不支持跨线程使用的如果在接收对象的构造函数中new的QUdpSocket,然后再将接收对象moveToThread,就会出现这个问题,因为此时线程还没有启动,你就已经new了QUdpSocket了。所以要等到线程的started()信号发出后,再创建QUdpSocket。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值