如何在QT中发送和接收UDP数据包

如何在QT中发送和接收UDP数据包,qt,networking,udp,Qt,Networking,Udp,我正在用QT编写一个小应用程序,它通过本地网络发送UDP数据包广播,并通过网络等待来自一个或多个设备的UDP响应数据包 创建套接字并发送广播数据包 udpSocketSend = new QUdpSocket(this); udpSocketGet = new QUdpSocket(this); bcast = new QHostAddress("192.168.1.255"); udpSocketSend->connectToHost(*bcast,65001,QIODevice::

我正在用QT编写一个小应用程序,它通过本地网络发送UDP数据包广播,并通过网络等待来自一个或多个设备的UDP响应数据包

创建套接字并发送广播数据包

udpSocketSend = new QUdpSocket(this);
udpSocketGet  = new QUdpSocket(this);
bcast = new QHostAddress("192.168.1.255");

udpSocketSend->connectToHost(*bcast,65001,QIODevice::ReadWrite);
udpSocketGet->bind(udpSocketSend->localPort());
connect(udpSocketGet,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));

QByteArray *datagram = makeNewDatagram(); // data from external function
udpSocketSend->write(*datagram);

应用程序正确发送数据包,响应数据包到达,但从未调用
readPendingDatagrams()
函数。我已经使用Wireshark验证了数据包的发送和接收,并且应用程序正在使用Process Explorer在Wireshark中指示的端口上侦听。

您正在以
QIODevice::ReadWrite
模式绑定
udpSocketSend
。这就是接收数据报的对象

尝试以下方法之一:

  • 在只写模式下绑定发送套接字,在只接收模式下绑定接收套接字
  • 将同一套接字用于两个目的(完全删除
    udpSocketGet

取决于您的限制。

我解决了这个问题。这是解决办法

udpSocketSend = new QUdpSocket(this);
udpSocketGet  = new QUdpSocket(this);
host  = new QHostAddress("192.168.1.101");
bcast = new QHostAddress("192.168.1.255");

udpSocketSend->connectToHost(*bcast,65001);
udpSocketGet->bind(*host, udpSocketSend->localPort());
connect(udpSocketGet,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));

QByteArray *datagram = makeNewDatagram(); // data from external function
udpSocketSend->write(*datagram);
网络上的设备侦听端口65001,并响应接收到的数据包的源端口上的数据包。有必要使用
connectToHost(…)
来了解要为响应数据包绑定的端口


还需要绑定到正确的地址和端口以接收数据包。这就是问题所在。

对我来说,将绑定从

udpSocket->bind(QHostAddress::LocalHost, 45454);
简化

udpSocket->bind(45454);

真有办法

两种解决方案都不起作用。使用udpSocketSend->bind(udpSocketSend->localPort())和connect(udpSocketSend,SIGNAL(readyRead()),此插槽(readPendingDatagrams())不会触发readPendingDatagrams()。还可以使用QIODevice::WriteOnly配置udpSocketSend,并且不会触发readPendingDatagrams()。由于这是UDP,connectToHost(…)方法不绑定到端口,因此它只设置udpSocketSend,以便可以使用udpSocketSend->write(*数据报),而不是udpSocketSend->writeDatagram(…),这不建议在连接的套接字上使用。