关于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。

展开阅读全文

没有更多推荐了,返回首页