我正在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);
Run Code Online (Sandbox Code Playgroud)
应用程序正确发送数据包,响应数据包到达,但从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);
Run Code Online (Sandbox Code Playgroud)
网络上的设备侦听端口65001,并响应收到的数据包的源端口上的数据包.有必要使用connectToHost(...)以便知道要为响应数据包绑定哪个端口.
还必须绑定到正确的地址和端口以接收数据包.这是问题所在.
您正在绑定您的udpSocketSendinQIODevice::ReadWrite模式。这就是将要接收数据报的对象。
尝试以下之一:
udpSocketGet完全删除)。取决于你的限制。
| 归档时间: |
|
| 查看次数: |
26825 次 |
| 最近记录: |