概念:
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 //对接收方来说,返回发送方的网络地址
运行结果:
遇到的坑:
发送端发出的UDP报文,接收端无法接收,通过抓包显示“端口不可达”,
如图所示,
该问题总结如下:
1.对应的UDP端口,没有开机UDP服务。
2.发送端的端口与接收端的端口不一致。
参考资料:
参考文章1
[Qt 的官方示例代码]
C:\Qt\Examples\Qt-5.15.0\network\broadcastsender
C:\Qt\Examples\Qt-5.15.0\network\broadcastreceiver