首页 文章

如何在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中指示的端口 .

2 回答

  • 1

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

    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 和端口以接收数据包 . 这是问题所在 .

  • 8

    您在 QIODevice::ReadWrite 模式下绑定了 udpSocketSend . 所以's the object that'将接收数据报 .

    尝试以下之一:

    • 在只写模式下绑定发送套接字,并在仅接收模式下接收一个

    • 使用相同的套接字用于两种目的(完全删除 udpSocketGet ) .

    取决于你的约束 .

相关问题