QUdpSocket 类

QUdpSocket 类提供了一个 UDP 套接字。更多信息...

头文件 #include <QUdpSocket>
CMakefind_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmakeQT += network
继承 QAbstractSocket

注意: 本类中所有函数都是 可重入的

公共函数

QUdpSocket(QObject *parent = nullptr)
virtual~QUdpSocket()
boolhasPendingDatagrams() const
booljoinMulticastGroup(const QHostAddress &groupAddress)
booljoinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
boolleaveMulticastGroup(const QHostAddress &groupAddress)
boolleaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
QNetworkInterfacemulticastInterface() const
qint64pendingDatagramSize() const
qint64readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)
QNetworkDatagramreceiveDatagram(qint64 maxSize = -1)
voidsetMulticastInterface(const QNetworkInterface &iface)
qint64writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
qint64writeDatagram(const QNetworkDatagram &datagram)
qint64writeDatagram(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::MulticastTtlOptionQAbstractSocket::MulticastLoopbackOption来设置TTL和环回套接字选项。使用setMulticastInterface()来控制多播数据包的输出接口,并使用multicastInterface()来查询。

使用QUdpSocket,您还可以通过connectToHost()建立到UDP服务器的虚拟连接,然后使用read()和write()交换数据包,无需为每个数据包指定接收者。

广播发送者广播接收者多播发送者多播接收者示例说明了如何在应用程序中使用QUdpSocket。

另请参阅 QTcpSocketQNetworkDatagram

成员函数文档

[显式] 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公司及其在世界其他国家的商标。所有其他商标均为各自所有者的财产。