我可以使用QAbstractSocket :: connectToHost()来接收广播的udp数据报吗?
如果我尝试未经修改的广播服务器/接收器,则所有工作和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]
现在它没有接收广播数据报,但它接收到正确的单播数据报。
netstat命令报告是:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp6 0 0 ::1:45454 ::1:* ESTABLISHED 11488/broadcastrece
我想知道为什么看起来不同的本地地址,我错在哪里。
最好的问候 最大答案 0 :(得分:1)
如果查看official documentation of QUdpSocket,您将看到以下段落,该段解释了如何更好地使用QUdpSocket:
使用此类的最常用方法是绑定到地址和 端口使用
bind()
,然后拨打writeDatagram()
和readDatagram()
/receiveDatagram()
传输数据。如果你想使用标准QIODevice
函数read()
,readLine()
,write()
等,您必须先行 通过调用connectToHost()
直接将套接字连接到对等方。
因此,您对connectToHost()
的呼叫无需,您只需绑定然后侦听信号readyRead()
,然后从插槽中使用{{1}获取原始数据包数据或readDatagram()
获取预解析数据。
这可能看似违反直觉,但由于UDP协议的性质,没有连接,并且任何节点都可以将数据包发送到未启动的任何其他节点,因此一旦receiveDatagram()
您可以接收UDP数据包来自任何人。
源地址&amp;在这种情况下,端口将成为数据报本身的一部分。您可以在bind()
函数签名的参数中看到这一点:
receiveDatagram()
但需要注意的是,您可能会遇到通过UDP进行通信的问题,因为任何转换网关(NAT路由器)都将丢弃所有数据包,因为它们是未启动的。这是一个常见问题,除非您控制端点之间的路由器,否则需要一些clever tricks来解决。
希望这是有益的。