QNetworkDatagram 类

QNetworkDatagram 类提供了 UDP 数据报的数据和元数据。更多信息...

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

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

公有函数

QNetworkDatagram()
QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)
QNetworkDatagram(const QNetworkDatagram &other)
voidclear()
QByteArraydata() const
QHostAddressdestinationAddress() const
intdestinationPort() const
inthopLimit() const
uintinterfaceIndex() const
boolisNull() const
boolisValid() const
QNetworkDatagrammakeReply(const QByteArray &payload) const &
QNetworkDatagrammakeReply(const QByteArray &payload) &&
QHostAddresssenderAddress() const
intsenderPort() const
voidsetData(const QByteArray &data)
voidsetDestination(const QHostAddress &address, quint16 port)
voidsetHopLimit(int count)
voidsetInterfaceIndex(uint index)
voidsetSender(const QHostAddress &address, quint16 port = 0)
voidswap(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 (桌面)支持支持支持
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);

如果Qt的未来版本修改 QNetworkDatagram 以携带更多元数据,则此函数将根据需要复制该元数据。

如果目的地地址是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)

创建其他数据报的副本,包括有效负载和元数据。

要创建适合在回复中发送的数据报,请使用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对象为null,则返回true。此函数是isValid的相反。

bool QNetworkDatagram::isValid() const

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

QHostAddress QNetworkDatagram::senderAddress() const

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

如果没有在数据报上设置发送者地址,返回的对象将向QHostAddress::isNull返回true。

另请参阅destinationAddresssenderPortsetSender

int QNetworkDatagram::senderPort() const

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

如果没有与该数据报关联发送者地址,此函数将返回-1。

另请参阅senderAddressdestinationPortsetSender

void QNetworkDatagram::setData(const QByteArray &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)

将与此数据报相关联的跳数限制设置为我们equivcount。跳数限制是在IP数据包过期并返回错误到数据报发送者之前允许转发节点的数量。在IPv4中,此值通常称为“存活时间” (TTL)。

通常没有必要在从网络上接收到数据报上调用此函数。

如果是外出包,则发送IP报头时应设置此值。值的合法范围是1到255。该函数还接受-1作为值,指示操作系统选择此值。

参阅 hopLimit()。

void QNetworkDatagram::setInterfaceIndex(uint index)

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

通常没有必要在从网络上接收到数据报上调用此函数。

如果这是外出包,这是数据报应发送的接口索引。值为0指示操作系统应根据其他因素选择接口。

请注意,也可以使用QHostAddress::setScopeId()来设置IPv6目标地址的接口索引,然后使用setDestination()。如果目标地址中设置的σκερ egy和equivalent是equivalent,则操作系统发送数据报的接口是不确定的。

参阅 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();

© 2024 Qt公司版权所有。本文档中的文档贡献属于各自的版权所有者。本文档是根据自由软件基金会的GNU自由文档许可协议第1.3版许可的。Qt及其标志是芬兰和/或世界各地的Qt公司的商标。所有其他商标均为各自所有者的财产。