QUdpSocket 类
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。
成员函数文档
[显式]
QUdpSocket::QUdpSocket(QObject *parent = nullptr)
创建一个QUdpSocket对象。
parent传递给QObject构造函数。
另请参阅 socketType。
[虚拟非要害操作]
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 指定的多播组,操作系统选择的默认接口。套接字必须在bound状态,否则将发生错误。
此函数在成功时返回 true
;否则返回 false
并设置套接字错误。
注意:应使用与 joinMulticastGroup 传递的相同参数调用此函数。
另请参阅:joinMulticastGroup()。
bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
这是一个重载函数。
离开接口 iface 上由 groupAddress 指定的多播组。
注意:应使用与 joinMulticastGroup 传递的相同参数调用此函数。
另请参阅:joinMulticastGroup()。
QNetworkInterface QUdpSocket::multicastInterface() const
返回多播数据报出的接口。这对应于IPv4套接字的IP_MULTICAST_IF套接字选项和IPv6套接字的IPV6_MULTICAST_IF套接字选项。如果没有之前设置接口,则此函数返回一个无效的 QNetworkInterface。套接字必须在bound状态,否则返回无效的 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。
如果 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 的数据报发送到主机地址 address 的端口 port。成功返回发送的字节数;否则返回 -1。
数据报总是以一个块的形式写入。数据报的最大大小高度依赖于平台,但可能低至 8192 字节。如果数据报太大,此函数将返回 -1,并且 error() 将返回 DatagramTooLargeError。
通常不建议发送超过 512 字节的数据报,因为即使在成功发送后,它们在到达最终目的地之前可能也会被 IP 层分段。
注意:在连接的 UDP 套接字上调用此函数可能会导致错误且不会发送任何数据包。如果您正在使用连接的套接字,请使用 write() 来发送数据报。
另请参阅 readDatagram() 和 write。
qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)
这是一个重载函数。
将数据报文 datagram 发送到包含在 datagram 中的主机地址和端口号,使用那里也设置的网络接口和跳数限制。如果目标地址和端口号未设置,此函数将发送到 connectToHost() 传递的地址。
如果目标地址是具有非空 作用域 ID 的 IPv6 地址,但与 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。
© 2024 The Qt Company Ltd. 本文档中包含的文档贡献是各自所有者的版权。本文档是根据由自由软件基金会发布的GNU自由文档许可协议第1.3版提供的。Qt及其相应商标是芬兰的Qt公司及其在世界其他国家的商标。所有其他商标均为各自所有者的财产。