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

9
我正在使用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 中指定的端口。

3个回答

9
我解决了这个问题。以下是解决方案。
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(...)

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


1

您正在将udpSocketSend绑定在QIODevice :: ReadWrite模式下。因此,该对象将接收数据报。

尝试以下之一:

  • 将发送套接字绑定为只写模式,将接收套接字绑定为只读模式
  • 对于两个目的,使用同一个套接字(完全删除udpSocketGet)。

根据您的约束条件而定。


没有一个解决方案奏效。使用udpSocketSend->bind(udpSocketSend->localPort())和connect(udpSocketSend,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()))无法触发readPendingDatagrams()。将udpSocketSend配置为QIODevice::WriteOnly也无法触发readPendingDatagrams()。由于这是UDP,connectToHost(...)方法不会绑定到端口,它只是设定了udpSocketSend,以便它可以使用udpSocketSend->write(*datagram)而不是udpSocketSend->writeDatagram(...),后者并不推荐在连接的socket上使用。 - zuwgap

1

对我来说,将绑定从

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

简单化

udpSocket->bind(45454);

能解决问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接