1. QUdpSocket 接口概述
QUdpSocket 是 Qt 框架中用于 UDP 网络通信的核心类,它继承自 QAbstractSocket 和 QIODevice。UDP(User Datagram Protocol)是一种无连接的传输层协议,与 TCP 不同,它不提供可靠性保证、流量控制或拥塞控制机制,但具有更低的延迟和更简单的协议开销。
1.1 UDP 协议特性
UDP 协议有几个关键特性需要特别注意:
- 无连接性:不需要建立连接即可发送数据
- 不可靠性:不保证数据报的到达顺序和可靠性
- 数据报边界:每个 send 操作对应一个完整的数据报
- 轻量级:协议头只有 8 字节,比 TCP 的 20 字节更精简
这些特性使得 UDP 特别适合以下场景:
- 实时音视频传输
- 在线游戏
- DNS 查询
- 网络发现协议(如 SSDP)
1.2 QUdpSocket 继承关系
QUdpSocket 的类继承关系如下:
code复制QIODevice -> QAbstractSocket -> QUdpSocket
这种继承关系意味着:
- 可以使用 QIODevice 的读写接口
- 继承了 QAbstractSocket 的网络相关功能
- 提供了 UDP 特有的操作接口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心 UDP 接口
2.1 数据发送接口
QUdpSocket 提供了两个主要的发送数据方法:
cpp复制qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &address, quint16 port)
qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
这两个方法的主要区别在于数据输入的形式:
- 第一个版本接受 QByteArray,使用更方便
- 第二个版本接受原始指针和长度,性能更高
参数说明:
datagram/data:要发送的数据内容address:目标主机地址port:目标端口号
返回值:
- 成功时返回实际发送的字节数
- 失败时返回 -1
注意事项:
- UDP 数据报大小不应超过 512 字节(避免 IP 分片)
- 即使返回成功,也不保证对方实际收到数据
- 不需要事先调用 bind() 即可发送数据
2.2 数据接收接口
接收数据的主要方法是:
cpp复制qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)
参数说明:
data:接收数据的缓冲区maxSize:缓冲区最大容量address:可选参数,返回发送方 IP 地址port:可选参数,返回发送方端口号
返回值:
- 成功时返回实际读取的字节数
- 失败时返回 -1
最佳实践:
- 应先调用 pendingDatagramSize() 获取数据报大小
- 分配足够大的缓冲区
- 检查返回值以确认是否读取成功
2.3 数据报查询接口
QUdpSocket 提供了两个辅助方法来查询待处理数据报:
cpp复制bool hasPendingDatagrams() const
qint64 pendingDatagramSize() const
典型使用模式:
cpp复制while (socket.hasPendingDatagrams()) {
qint64 size = socket.pendingDatagramSize();
QByteArray buffer(size, 0);
socket.readDatagra
