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

时间:2011-06-29 03:56:21

标签: 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::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 个答案:

答案 0 :(得分:8)

我解决了这个问题。这是解决方案。

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 :(得分:1)

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

尝试以下方法之一:

  • 以只写模式绑定发送套接字,并以只接收模式接收接收模式
  • 出于两种目的使用相同的套接字(完全删除udpSocketGet)。

取决于你的约束。

答案 2 :(得分:1)

对我来说,将绑定更改为

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

简单

udpSocket->bind(45454);

做到了!