QUdpSocket 编程注意事项

概念:

UDP是无连接的用户数据报协议,不能保证数据的全部被对方收到。

发送端,接收端数据收发流程:

发送端示例代码:

QUdpSocket *udpSocket = new QUdpSocket(this);
QByteArray datagram = "UDP Datagram message ";
udpSocket->writeDatagram(datagram, QHostAddress("169.254.254.11"), 36529);

接收端示例代码:

 void Server::initSocket()
 {
     udpSocket = new QUdpSocket(this);  
     udpSender->bind(QHostAddress(localIP),36529, QUdpSocket::ShareAddress);

     connect(udpSocket, &QUdpSocket::readyRead,
             this, &Server::readPendingDatagrams);
 }

 void Server::readPendingDatagrams()
 {
     while (udpSocket->hasPendingDatagrams()) {
         QNetworkDatagram nd = udpSender->receiveDatagram();
        statusLabel->setText(tr("Received datagram:\n \" %1 \" \n"
                                "Sender IP:%2 port:%3" "\n"
                                "Local  IP:%4 port:%5"
                                "").arg(nd.data().constData()).arg(nd.senderAddress().toString()).arg(nd.senderPort()).arg(nd.destinationAddress().toString()).arg(nd.destinationPort()));

     }
 }

QNetworkDatagram 网络数据包类

QByteArray data() const //UDP实际数据
QHostAddress destinationAddress() const //对接收方来说,返回发送方的网络地址
int destinationPort() const //对接收方来说,返回发送方的网络地址

运行结果:

QUdpSocket 编程注意事项_第1张图片

遇到的坑:
发送端发出的UDP报文,接收端无法接收,通过抓包显示“端口不可达”,
如图所示,QUdpSocket 编程注意事项_第2张图片
该问题总结如下:
1.对应的UDP端口,没有开机UDP服务。
2.发送端的端口与接收端的端口不一致。

源代码下载

参考资料:
参考文章1
[Qt 的官方示例代码]
C:\Qt\Examples\Qt-5.15.0\network\broadcastsender
C:\Qt\Examples\Qt-5.15.0\network\broadcastreceiver

你可能感兴趣的:(C/C++,qt,udp,socket)