QNetworkDatagram Class

QNetworkDatagram 类提供 UDP 数据报的数据和元数据。更多

头文件: #include <QNetworkDatagram>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network

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

公共函数

QNetworkDatagram()
QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)
QNetworkDatagram(const QNetworkDatagram &other)
void clear()
QByteArray data() const
QHostAddress destinationAddress() const
int destinationPort() const
int hopLimit() const
uint interfaceIndex() const
bool isNull() const
bool isValid() const
QNetworkDatagram makeReply(const QByteArray &payload) &&
QNetworkDatagram makeReply(const QByteArray &payload) const &
QHostAddress senderAddress() const
int senderPort() const
void setData(const QByteArray &data)
void setDestination(const QHostAddress &address, quint16 port)
void setHopLimit(int count)
void setInterfaceIndex(uint index)
void setSender(const QHostAddress &address, quint16 port = 0)
void swap(QNetworkDatagram &other)
QNetworkDatagram &operator=(const QNetworkDatagram &other)

详细说明

QNetworkDatagram 可与QUdpSocket 类一起使用,以表示 UDP(用户数据报协议)数据报中包含的全部信息。QNetworkDatagram 封装了数据报的以下信息:

  • 有效载荷数据
  • 发送方地址和端口号
  • 目标地址和端口号
  • 剩余跳数限制(在 IPv4 中,该字段通常称为 "生存时间" - TTL);
  • 接收数据报或发送数据报的网络接口索引。

QUdpSocket 我们将尽可能在所有操作系统上匹配通用行为,但在某些操作系统中,并不能获得上述所有元数据。使用 () 发送数据报时无法设置的元数据将被静默丢弃。QUdpSocket::writeDatagram

接收时,senderAddress() 和senderPort() 属性包含发送数据报的对等程序的地址和端口,而destinationAddress() 和destinationPort() 属性包含数据报中的目标。这通常是当前机器的本地地址,但也可以是 IPv4 广播地址(如 "255.255.255.255")或 IPv4 或 IPv6 组播地址。应用程序可能会发现,确定数据报是专门通过单播寻址发送给本机的,还是发送给多个目的地的,是非常有用的。

发送时,senderAddress() 和senderPort() 应包含发送时使用的本地地址。发送方地址必须是分配给本机的地址,可通过QNetworkInterface 获取,端口号必须是套接字绑定的端口号。任一字段都可以不设置,由操作系统以默认值填写。destinationAddress() 和destinationPort() 字段可以设置为不同于 UDP 套接字当前关联的目标地址。

通常,在发送数据报以回复先前收到的数据报时,我们会将destinationAddress() 设置为接收数据报的senderAddress() ,端口号也是如此。为方便这一常见过程,QNetworkDatagram 提供了函数makeReply() 。

对于接收到的数据报,hopCount() 函数包含数据包的剩余跳数限制。发送时,它包含要设置的跳数限制。大多数协议会将此值设为默认值,让操作系统决定使用的最佳值。IPv4 上的组播通常使用该字段指示组播组的范围(链路本地、组织本地或全局)。

interfaceIndex() 函数包含接收数据包的操作系统接口索引。该值与可在QHostAddress::scopeId() 属性上设置的值相同,并与QNetworkInterface::index() 属性相匹配。向全局地址发送数据包时,无需设置接口索引,因为操作系统会使用系统路由表选择正确的接口。在向链路本地目标发送数据报(无论是单播还是组播)时,该属性非常重要。

功能支持

并非所有操作系统都支持 QNetworkDatagram 的某些功能。所有系统都只支持远程主机(接收数据包的发送方和发出数据包的目的地)的地址和端口。在大多数操作系统中,其他功能仅支持 IPv6。软件应在运行时检查其余功能是否可用于 IPv4 地址。

当前支持的功能如下:

操作系统本地地址跳数接口索引
FreeBSD支持支持仅适用于 IPv6
Linux支持支持支持
OS X支持支持仅适用于 IPv6
其他支持 RFC 3542 的 Unix仅适用于 IPv6仅适用于 IPv6仅适用于 IPv6
视窗(桌面)支持支持支持
Windows RT不支持不支持不支持

另请参阅 QUdpSocketQNetworkInterface

成员函数文档

QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) &&

QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) const &

创建一个新的QNetworkDatagram ,代表对该传入数据报的回复,并将有效载荷数据设置为payload 。该函数是将数据报回复给原始发送者的一种非常方便的方法。

举例说明

    void Server::readPendingDatagrams()
    {
        while (udpSocket->hasPendingDatagrams()) {
            QNetworkDatagram datagram = udpSocket->receiveDatagram();
            QByteArray replyData = processThePayload(datagram.data());
            udpSocket->writeDatagram(datagram.makeReply(replyData));
        }
    }

此函数特别方便,因为它会自动将此数据报中的参数复制到新数据报中:

  • 将此数据报的发送方地址和端口复制到新数据报的目的地址和端口;
  • 将该数据报的接口索引(如果有)复制到新数据报的接口索引中;
  • 只有当地址是 IPv6 全局(非多播)地址时,该数据报的目标地址和端口才会被复制到新数据报的发送者地址和端口;
  • 新数据报的跳数限制重置为默认值(-1);

如果QNetworkDatagram 在未来的 Qt XML 版本中被修改以携带更多的元数据,此函数将视情况复制这些元数据。

如果该数据报的目标地址是 IPv4 地址,则不会被复制,因为如果不彻底搜索分配给本机的所有地址,就无法将 IPv4 广播地址与普通 IPv4 地址区分开来。如果发送者地址等于广播地址,发送数据报很可能会失败。不过,这应该不会影响通信,因为具有多个 IPv4 地址的网络接口并不常见,所以操作系统选择的地址很可能是对等程序可以理解的地址。

注意: 该函数带有 rvalue 和 lvalue 引用限定符重载,因此在调用makeReply 之前,最好尽可能确保该对象为 rvalue,以便更好地利用移动语义。为此,上面的示例将使用

    udpSocket->writeDatagram(std::move(datagram).makeReply(replyData));

QNetworkDatagram::QNetworkDatagram()

创建一个无有效载荷数据和未定义目标地址的 QNetworkDatagram 对象。

有效载荷可通过setData() 修改,目标地址可通过setDestination() 设置。

如果目的地址未定义,QUdpSocket::writeDatagram() 将尝试使用QUdpSocket::connectToHost() 将数据报发送到上次关联的地址。

QNetworkDatagram::QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)

创建 QNetworkDatagram 对象,并将data 设置为有效载荷数据,同时将destinationAddressport 设置为数据报的目标地址。

QNetworkDatagram::QNetworkDatagram(const QNetworkDatagram &other)

创建other 数据报的副本,包括有效载荷和元数据。

要创建适合在回复中发送的数据报,请使用QNetworkDatagram::makeReply() ;

void QNetworkDatagram::clear()

清除QNetworkDatagram 对象中的有效载荷数据和元数据,将其重置为默认值。

QByteArray QNetworkDatagram::data() const

返回该数据报的数据有效载荷。对于从网络接收的数据报,它包含数据报的有效载荷。对于发出的数据报,它就是要发送的数据报。

请注意,数据报可以不带数据发送,因此返回的QByteArray 可能是空的。

另请参阅 setData()。

QHostAddress QNetworkDatagram::destinationAddress() const

返回与此数据报相关的目标地址。对于从网络接收的数据报,它是对等节点发送数据报的地址,可以是本机地址,也可以是组播或广播地址。对于发出的数据报,它是数据报应发送到的地址。

如果未在该数据报上设置目标地址,返回的对象将向QHostAddress::isNull() 报告 true。

另请参阅 senderAddress()、destinationPort() 和setDestination()。

int QNetworkDatagram::destinationPort() const

返回与此数据报相关联的目的地端口号。对于从网络接收的数据报,它是对等节点发送数据报的本地端口号。对于发出的数据报,它是数据报应发送到的对等节点端口。

如果该数据报没有关联目标地址,则该函数返回-1。

另请参阅 destinationAddress()、senderPort() 和setDestination()。

int QNetworkDatagram::hopLimit() const

返回与此数据报相关的跳数限制。跳数限制是指在 IP 数据包过期并将错误发回数据报发送方之前,允许转发 IP 数据包的节点数。在 IPv4 中,该值通常称为 "生存时间"(TTL)。

如果该数据报是从网络中接收到的,那么该值就是数据报接收后的剩余跳数,每个转发数据包的节点都会将该值减 1。值为-1 表示无法获得跳数限制。

如果这是一个传出数据报,该值将在发送时设置在 IP 报头中。值为-1 表示操作系统应选择该值。

另请参阅 setHopLimit()。

uint QNetworkDatagram::interfaceIndex() const

返回与该数据报相关联的接口索引。接口索引是一个正数,在操作系统中唯一标识网络接口。该数字与QNetworkInterface::index() 返回的接口值一致。

如果该数据报是从网络接收的,那么这就是接收数据包的接口索引。如果是发出的数据报,这是数据报应在哪个接口上发送的索引。

值为 0 表示接口索引未知。

另请参阅 setInterfaceIndex()。

bool QNetworkDatagram::isNull() const

如果QNetworkDatagram 对象为空,则返回 true。该函数与isValid() 相反。

bool QNetworkDatagram::isValid() const

如果QNetworkDatagram 对象有效,则返回 true。有效的QNetworkDatagram 对象至少包含一个发送方或接收方地址。有效数据报可以包含空有效载荷。

QHostAddress QNetworkDatagram::senderAddress() const

返回与该数据报相关的发送方地址。对于从网络接收的数据报,它是发送该数据报的对等节点的地址。对于发出的数据报,它是发送时使用的本地地址。

如果未在该数据报上设置发件人地址,返回的对象将向QHostAddress::isNull() 报告为 "true"。

另请参阅 destinationAddress()、senderPort() 和setSender()。

int QNetworkDatagram::senderPort() const

返回与该数据报相关的发送方的端口号。对于从网络接收的数据报,它是对等节点发送数据报的端口号。对于发出的数据报,它是数据报应从的本地端口。

如果该数据报没有关联发件人地址,则该函数返回-1。

另请参阅 senderAddress()、destinationPort() 和setSender()。

void QNetworkDatagram::setData(const QByteArray &data)

将此数据报的数据有效载荷设置为data 。通常情况下,无需在接收到的数据报上调用此函数。对于发出的数据报,该函数将设置要在网络上发送的数据。

data由于数据报可以为空,因此QByteArray 的有效值为空。

另请参阅 data()。

void QNetworkDatagram::setDestination(const QHostAddress &address, quint16 port)

将与该数据报相关联的目标地址设置为地址address 和端口号port 。目标地址和端口号通常由QUdpSocket 在接收时设置,因此无需在接收数据报时调用此函数。

对于发出的数据报,该函数可用于设置数据报应发送到的地址。它可以是用于与对等设备通信的单播地址,也可以是发送给一组设备的广播或组播地址。

另请参阅 QUdpSocket::writeDatagram()、destinationAddress()、destinationPort() 和setSender()。

void QNetworkDatagram::setHopLimit(int count)

将与此数据报相关的跳数限制设置为count 。跳数限制是指在 IP 数据包过期并向数据报发送者发送错误信息之前,允许转发 IP 数据包的节点数。在 IPv4 中,该值通常称为 "生存时间"(TTL)。

从网络接收的数据报通常无需调用此函数。

如果这是一个发出的数据包,则该值将在发送时设置在 IP 报头中。该值的有效范围是 1 至 255。该函数还接受-1 的值,表示操作系统应选择该值。

另请参阅 hopLimit()。

void QNetworkDatagram::setInterfaceIndex(uint index)

将与该数据报关联的接口索引设置为index 。接口索引是一个正数,在操作系统中唯一标识网络接口。该数字与QNetworkInterface::index() 返回的接口值相匹配。

从网络接收数据报时,通常无需调用此函数。

如果这是一个发出的数据包,这就是数据报应在哪个接口上发送的索引。值为 0 表示操作系统应根据其他因素选择接口。

请注意,对于 IPv6 目标地址,也可以使用QHostAddress::setScopeId() 设置接口索引,然后再使用setDestination() 设置。如果目的地址和index 中设置的作用域 ID 不同,且都不为 0,则无法确定操作系统将在哪个接口上发送数据报。

另请参阅 interfaceIndex() 和 setInterfaceIndex()。

void QNetworkDatagram::setSender(const QHostAddress &address, quint16 port = 0)

将与该数据报相关联的发件人地址设置为address 和端口号port 。发件人地址和端口号通常由QUdpSocket 在接收时设置,因此无需在接收到的数据报上调用此函数。

对于发出的数据报,该函数可用于设置数据报应携带的地址。address 通常必须是分配给本机的本地地址之一,可通过QNetworkInterface 获取。如果不设置,操作系统将根据目的地选择最合适的地址。

端口号port 必须是与套接字相关联的端口号(如果有的话)。可以使用 0 表示操作系统应选择端口号。

另请参阅 QUdpSocket::writeDatagram()、senderAddress()、senderPort() 和setDestination()。

[noexcept] void QNetworkDatagram::swap(QNetworkDatagram &other)

将该数据报与other 互换。该操作速度非常快,从未出现过故障。

QNetworkDatagram &QNetworkDatagram::operator=(const QNetworkDatagram &other)

复制other 数据报,包括有效载荷和元数据。

要创建适合在回复中发送的数据报,请使用QNetworkDatagram::makeReply() ;

© 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.