Networking Qt5:connectToHost()接收广播udp数据报
我可以使用QAbstractSocket::connectToHost()接收广播udp数据报吗 如果我尝试未修改的broadcastsender/receiver,则所有工作正常,netstat为: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 :::*
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