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

时间:2017-03-15 08:54:37

标签: networking udp qt5 broadcast

我可以使用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

我想知道为什么看起来不同的本地地址,我错在哪里。

最好的问候 最大

1 个答案:

答案 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来解决。

希望这是有益的。