QUdpSocket Class
QUdpSocket 类提供了一个 UDP 套接字。更多内容...
| 头文件: | #include <QUdpSocket> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake: | QT += network |
| 继承自: | QAbstractSocket |
- 所有成员列表(包括继承的成员)
- QUdpSocket 属于网络编程 API 的一部分。
注意:该类中的所有函数均为可重入函数。
公共函数
| QUdpSocket(QObject *parent = nullptr) | |
| virtual | ~QUdpSocket() |
| bool | hasPendingDatagrams() const |
| bool | joinMulticastGroup(const QHostAddress &groupAddress) |
| bool | joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface) |
| bool | leaveMulticastGroup(const QHostAddress &groupAddress) |
| bool | leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface) |
| QNetworkInterface | multicastInterface() const |
| qint64 | pendingDatagramSize() const |
| qint64 | readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr) |
| QNetworkDatagram | receiveDatagram(qint64 maxSize = -1) |
| void | setMulticastInterface(const QNetworkInterface &iface) |
| qint64 | writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port) |
| qint64 | writeDatagram(const QNetworkDatagram &datagram) |
| qint64 | writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port) |
详细说明
UDP(用户数据报协议)是一种轻量级、不可靠、面向数据报、无连接的协议。当可靠性不重要时,可以使用它。QUdpSocket 是QAbstractSocket 的子类,允许您发送和接收 UDP 数据报。
使用该类的最常见方法是使用bind()绑定到一个地址和端口,然后调用writeDatagram()和readDatagram()/receiveDatagram()来传输数据。如果您想使用标准的QIODevice 函数read()、readLine()、write()等,则必须先通过调用connectToHost()将套接字直接连接到对等方。
每当向网络写入一个数据报时,套接字都会发出bytesWritten() 信号。如果您仅想发送数据报,则无需调用bind()。
每当有数据报到达时,都会发出readyRead()信号。此时,hasPendingDatagrams()会返回true 。调用pendingDatagramSize()可获取第一个待处理数据报的大小,并调用readDatagram()或receiveDatagram()来读取该数据报。
注意: 当接收到readyRead() 信号时,应读取该 入站数据报,否则该信号将不会针对下一个数据报发出。
示例:
void Server::initSocket()
{
udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress::LocalHost, 7755);
connect(udpSocket, &QUdpSocket::readyRead,
this, &Server::readPendingDatagrams);
}
void Server::readPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams()) {
QNetworkDatagram datagram = udpSocket->receiveDatagram();
processTheDatagram(datagram);
}
}QUdpSocket 还支持 UDP 多播。使用joinMulticastGroup() 和leaveMulticastGroup() 控制组成员身份,使用QAbstractSocket::MulticastTtlOption 和QAbstractSocket::MulticastLoopbackOption 设置 TTL 和环回套接字选项。使用setMulticastInterface() 控制多播数据报的传出接口,并使用multicastInterface() 查询该接口。
借助 QUdpSocket,您还可以使用connectToHost() 与 UDP 服务器建立虚拟连接,随后通过read() 和write() 交换数据报,而无需为每条数据报指定接收方。
另请参阅 QTcpSocket 和QNetworkDatagram 。
成员函数文档
[explicit] QUdpSocket::QUdpSocket(QObject *parent = nullptr)
创建一个 QUdpSocket 对象。
parent 该参数将传递给QObject 构造函数。
另请参阅 socketType()。
[virtual noexcept] QUdpSocket::~QUdpSocket()
销毁套接字,必要时关闭连接。
另请参阅 close()。
bool QUdpSocket::hasPendingDatagrams() const
如果至少有一个数据报正在等待读取,则返回true ;否则返回false 。
另请参阅 pendingDatagramSize() 和readDatagram()。
bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)
加入由 `groupAddress ` 指定的组播组,使用操作系统选择的默认接口。套接字必须处于 `BoundState` 状态,否则会发生错误。
请注意,若要加入 IPv4 组,您的套接字不得使用 IPv6 进行绑定(或在双模式下使用 `QHostAddress::Any`)。您必须改用 `QHostAddress::AnyIPv4 `。
若调用成功,该函数返回true ;否则返回false ,并相应地设置套接字错误。
注意: 并非所有操作系统都支持在不指定接口的情况下加入 IPv6 多播组。请考虑使用指定接口的重载版本。
另请参阅 leaveMulticastGroup()。
bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
在接口iface 上加入多播组地址groupAddress 。
这是一个重载函数。
另请参阅 leaveMulticastGroup()。
bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)
退出由groupAddress 指定的、位于操作系统选择的默认接口上的组播组。套接字必须处于BoundState状态,否则会发生错误。
若操作成功,该函数返回true ;否则返回false ,并相应地设置套接字错误。
注意: 调用此 函数时,应使用与传递给joinMulticastGroup() 的参数相同的参数。
另请参阅 joinMulticastGroup()。
bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
退出由groupAddress 指定的、位于iface 接口上的组播组。
注意: 调用此 函数时,应使用与传递给joinMulticastGroup() 函数相同的参数。
这是一个重载函数。
另请参见 joinMulticastGroup()。
QNetworkInterface QUdpSocket::multicastInterface() const
返回用于发送多播数据报的接口。 这对应于 IPv4 套接字的 IP_MULTICAST_IF 套接字选项以及 IPv6 套接字的 IPV6_MULTICAST_IF 套接字选项。如果之前未设置任何接口,则该函数将返回一个无效的 `QNetworkInterface`。套接字必须处于 `BoundState` 状态,否则将返回一个无效的 `QNetworkInterface `。
另请参阅 setMulticastInterface()。
qint64 QUdpSocket::pendingDatagramSize() const
返回第一个待处理 UDP 数据报的大小。如果没有可用数据报,则该函数返回 -1。
另请参阅 hasPendingDatagrams() 和readDatagram()。
qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)
接收一个大小不超过maxSize 字节的数据报,并将其存储在data 中。发件人的主机地址和端口分别存储在*address 和*port 中(除非这些指针为nullptr )。
成功时返回数据报的大小;否则返回 -1。
如果maxSize 过小,数据报的其余部分将会丢失。为避免数据丢失,请在尝试读取数据报之前调用pendingDatagramSize()来确定待读取数据报的大小。如果maxSize 为0,则该数据报将被丢弃。
另请参阅 writeDatagram()、hasPendingDatagrams() 和pendingDatagramSize()。
QNetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)
接收一个大小不超过maxSize 字节的数据报,并将其连同发件人的主机地址和端口一起返回至QNetworkDatagram 对象中。如果可能,该函数还会尝试确定数据报在接收时的目标地址、端口以及跳数。
若操作失败,则返回一个QNetworkDatagram ,该对象报告not valid 。
如果maxSize 过小,数据报的其余部分将丢失。如果maxSize 为0,数据报将被丢弃。如果maxSize 为-1(默认值),该函数将尝试读取整个数据报。
另请参阅 writeDatagram()、hasPendingDatagrams() 和pendingDatagramSize()。
void QUdpSocket::setMulticastInterface(const QNetworkInterface &iface)
将多播数据报的发送接口设置为接口iface 。这对应于 IPv4 套接字的 IP_MULTICAST_IF 套接字选项以及 IPv6 套接字的 IPV6_MULTICAST_IF 套接字选项。套接字必须处于 BoundState 状态,否则此函数不执行任何操作。
另请参阅 multicastInterface()、joinMulticastGroup() 和leaveMulticastGroup()。
qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
将大小为size 、目标地址为data 的数据报发送到主机地址address 的端口port 。成功时返回已发送的字节数;否则返回 -1。
数据报总是作为一个整体写入的。数据报的最大大小在很大程度上取决于平台,但可能低至 8192 字节。如果数据报过大,此函数将返回 -1,而error() 将返回 DatagramTooLargeError。
通常不建议发送大于 512 字节的数据报,因为即使发送成功,它们在到达最终目的地之前也很可能会被 IP 层分片。
警告: 在已建立连接的 UDP 套接字上调用 此函数可能会导致错误,且无法发送数据报。若使用已建立连接的套接字,请使用write() 发送数据报。
另请参阅 readDatagram() 和write()。
qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)
将数据报datagram 发送至datagram 中包含的主机地址和端口号,并使用该文件中设置的网络接口和跳数限制。如果未设置目标地址和端口号,则该函数将向传递给connectToHost() 的地址发送数据。
如果目标地址为 IPv6 且scope id 不为空,但与datagram 中指定的接口索引不一致,则操作系统将选择哪个接口进行发送是未定义的。
如果调用成功,该函数返回已发送的字节数;如果遇到错误,则返回 -1。
警告: 在已连接的 UDP 套接字上调用 此函数可能会导致错误,并且不会发送任何数据包。如果您正在使用已连接的套接字,请使用write() 来发送数据报。
这是一个重载函数。
另请参阅 QNetworkDatagram::setDestination()、QNetworkDatagram::setHopLimit() 和QNetworkDatagram::setInterfaceIndex()。
qint64 QUdpSocket::writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
将数据报datagram 发送到主机地址host 的端口port 。
如果调用成功,该函数返回已发送的字节数;若遇到错误,则返回 -1。
这是一个重载函数。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.