我正在 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 中指示的端口。
我解决了这个问题。这是解决方案。
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(...)
为了知道为响应数据包绑定哪个端口。
还需要绑定到正确的address以及接收数据包的端口。这就是问题所在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)