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 指定的组播组。套接字必须处于绑定状态,否则会出错。
请注意,如果您试图加入一个 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 对象。如果可能,该函数还将尝试确定数据报的目标地址、端口以及接收时的跳数。
如果失败,则返回一个报告not valid 的QNetworkDatagram 。
如果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 发送到端口port 的主机地址address 。如果发送成功,则返回发送的字节数;否则返回-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。
© 2025 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.