Networking Qt5:connectToHost()接收广播udp数据报

Networking Qt5:connectToHost()接收广播udp数据报,networking,udp,qt5,broadcast,Networking,Udp,Qt5,Broadcast,我可以使用QAbstractSocket::connectToHost()接收广播udp数据报吗 如果我尝试未修改的broadcastsender/receiver,则所有工作正常,netstat为: Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp6 0 0 :::52337 :::*

我可以使用QAbstractSocket::connectToHost()接收广播udp数据报吗

如果我尝试未修改的broadcastsender/receiver,则所有工作正常,netstat为:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp6       0      0 :::52337                :::*                                12185/./broadcastse 
udp6       0      0 :::45454                :::*                                12172/broadcastrece
我对broadcastreceiver进行了如下修改:

//! [0]
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(45454, QUdpSocket::ShareAddress);
    udpSocket->connectToHost(QHostAddress(QHostAddress::Any),0); // <- added line
//! [0]
我想知道为什么它看起来不同的地方地址,我哪里错了

致意 Max

如果您查看,您将看到下面一段解释如何很好地使用QUdpSocket:

使用此类的最常见方法是绑定到地址和 使用
bind()
端口,然后调用
writeDatagram()
readDatagram()
/
receiveDatagram()
传输数据。如果你想使用标准
QIODevice
函数
read()
readLine()
write()
,等等,您必须首先 通过调用
connectToHost()
将套接字直接连接到对等方

因此,对
connectToHost()
的调用是不必要的,您应该只绑定然后监听信号,然后从插槽中使用
readDatagram()
获取原始数据包数据,或者使用
receiveDatagram()
获取预解析数据

这似乎有悖常理,但由于UDP协议的性质,没有连接,任何节点都可能向未启动的任何其他节点发送数据包,因此一旦您
bind()
就可以从任何节点接收UDP数据包

在这种情况下,源地址和端口将是数据报本身的一部分。您可以在函数签名的参数中看到这一点:

qint64-QUdpSocket::readDatagram(char*data,qint64-maxSize,QHostAddress*address=Q_-NULLPTR,quint16*port=Q_-NULLPTR)

不过需要注意的是,您可能会遇到通过UDP进行通信的问题,因为任何转换网关(NAT路由器)都会丢弃所有数据包,因为它们是未启动的。这是一个常见的问题,除非您控制端点之间的路由器,否则需要一些路由器才能绕过

希望这是有益的

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp6       0      0 ::1:45454               ::1:*                   ESTABLISHED 11488/broadcastrece