欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【QT】- QUdpSocket

【QT】- QUdpSocket

2025/1/25 2:32:07 来源:https://blog.csdn.net/jjjxxxhhh123/article/details/145326060  浏览:    关键词:【QT】- QUdpSocket

QUdpSocket 是 Qt 自带的一个类,属于 Qt 网络模块,用于进行 UDP(用户数据报协议) 通信。它提供了简便的接口来发送和接收 UDP 数据报(datagrams)。

UDP 是一种无连接的协议,适用于那些不需要确保数据可靠性和顺序的应用场景,比如实时游戏、流媒体、DNS 请求等。

  1. QUdpSocket 概述
    QUdpSocket 继承自 QAbstractSocket,可以用于进行基于 UDP 协议的数据发送和接收。
    它支持异步和同步操作,可以在发送和接收数据时使用事件驱动的机制。
    常用于客户端和服务器模型之间的通信。
  2. 常见操作
    发送数据
    接收数据
    绑定端口
    连接到远程地址和端口
  3. 使用 QUdpSocket
    3.1 创建和初始化 QUdpSocket
    你可以创建一个 QUdpSocket 实例,默认情况下,它不会绑定到本地端口,直到你显式地调用 bind() 来进行绑定。

cpp
QUdpSocket *udpSocket = new QUdpSocket(this);
3.2 发送数据
使用 writeDatagram() 方法发送数据报。该方法需要指定数据报内容、数据的大小、目标地址和端口。

cpp
QHostAddress targetAddress("127.0.0.1");  // 目标地址
quint16 targetPort = 12345;  // 目标端口// 发送消息
QString message = "Hello, UDP!";
udpSocket->writeDatagram(message.toUtf8(), targetAddress, targetPort);
message.toUtf8():将 QString 转换为字节数组。
targetAddress:目标主机的 IP 地址。
targetPort:目标端口号。

3.3 接收数据
通过连接到 readyRead() 信号来异步接收数据。每当有数据到达时,readyRead() 信号会被触发。

cpp
// 当有数据到达时触发 readyRead() 信号
connect(udpSocket, &QUdpSocket::readyRead, this, &MyClass::readPendingDatagrams);void MyClass::readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(), datagram.size());// 处理接收到的数据QString receivedMessage = QString::fromUtf8(datagram);qDebug() << "Received message:" << receivedMessage;}
}
udpSocket->hasPendingDatagrams():检查是否有待处理的数据报。
udpSocket->readDatagram():读取接收到的数据。

3.4 绑定端口
要接收数据,必须将 QUdpSocket 绑定到一个本地端口上。你可以使用 bind() 方法进行绑定。

cpp

quint16 localPort = 12345;  // 本地端口号
if (!udpSocket->bind(localPort)) {qDebug() << "Failed to bind port";
} else {qDebug() << "Listening on port" << localPort;
}

bind() 使得该套接字能够接收从网络上发往该端口的数据。
如果你不指定 QHostAddress::Any,它默认会绑定到本地地址 QHostAddress::Any,即所有可用的网络接口。
3.5 关闭套接字
如果你不再需要套接字,可以调用 close() 方法关闭它。

cpp

udpSocket->close();
4. 完整示例:UDP 客户端和服务器
4.1 UDP 客户端示例
cpp

#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QHostAddress>
#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QUdpSocket udpSocket;QHostAddress targetAddress("127.0.0.1");quint16 targetPort = 12345;QString message = "Hello from UDP client";// 发送数据udpSocket.writeDatagram(message.toUtf8(), targetAddress, targetPort);qDebug() << "Message sent to" << targetAddress << ":" << targetPort;return a.exec();
}

4.2 UDP 服务器示例
cpp

#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QHostAddress>
#include <QCoreApplication>
#include <QDebug>class UdpServer : public QObject {Q_OBJECTpublic:UdpServer(QObject *parent = nullptr) : QObject(parent) {// 初始化 QUdpSocketudpSocket = new QUdpSocket(this);// 绑定端口quint16 port = 12345;if (udpSocket->bind(port)) {qDebug() << "Listening on port" << port;} else {qDebug() << "Failed to bind port";}// 连接 readyRead 信号connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams);}private slots:void readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(), datagram.size());// 输出接收到的数据qDebug() << "Received message:" << QString::fromUtf8(datagram);}}private:QUdpSocket *udpSocket;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);UdpServer server;return a.exec();
}
  1. 总结
    QUdpSocket 是 Qt 提供的一个用于进行 UDP 通信的类。
    你可以使用 writeDatagram() 方法来发送数据,通过 readyRead() 信号和 readDatagram() 方法来接收数据。
    要接收数据,必须将 QUdpSocket 绑定到一个本地端口,通常通过 bind() 方法来完成。
    UDP 是无连接的协议,适用于那些对实时性要求高、但不需要完全可靠性的应用场景。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com