Qt网络编程:QNetworkDatagram

一、描述

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

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

二、成员函数

1、QNetworkDatagram makeReply(const QByteArray &payload)

     QNetworkDatagram makeReply(const QByteArray &payload)

用传入数据报的回复数据创建一个QNetworkDatagram对象。此功能可以非常方便地将数据报响应回原始发送者。

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

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

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

如果 QNetworkDatagram 在 Qt 的未来版本中被修改以携带更多元数据,该函数将适当地复制该元数据。

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

2、void clear()

清除此 QNetworkDatagram 对象中的有效负载数据和元数据,将它们重置为默认值。

3、QHostAddress destinationAddress()

返回与此数据报关联的目标地址。

4、int destinationPort()

返回与此数据报关联的目的地的端口号。

5、bool isNull()

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

6、bool isValid()

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

7、QHostAddress senderAddress()

返回与此数据报关联的发送方地址。

8、int senderPort()

返回与此数据报关联的发送方的端口号。

9、void setData(const QByteArray &data)

将此数据报的数据负载设置为数据。 通常不需要对接收到的数据报调用此函数。 对于传出数据报,此函数设置要在网络上发送的数据。由于数据报可以为空,因此空的 QByteArray 是数据的有效值。

10、void setDestination(const QHostAddress &address, quint16 port)

设置此数据报关联的目标地址、端口号。

11、void setHopLimit(int count)

设置此数据报关联的跳数限制。

通常不需要对从网络接收到的数据报调用此函数。

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

12、void setInterfaceIndex(uint index)

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

通常不需要对从网络接收到的数据报调用此函数。

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

13、void setSender(const QHostAddress &address, quint16 port = 0)

设置此数据报关联的发送方的地址、端口号。

发送方地址和端口号通常在接收时由 QUdpSocket 设置,因此无需对接收到的数据报调用此函数。
对于传出数据报,该函数可用于设置数据报应携带的地址。地址地址通常必须是分配给本机的本地地址之一,可以使用 QNetworkInterface 获取。 如果不设置,操作系统将选择最合适的地址来使用给定的目的地。

端口号 port 必须是与socket关联的端口号(如果有)。 0 可用于指示让操作系统选择端口号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值