QT UDP套接字返回空数据报

QT UDP Socket Returning Empty Datagrams

本文关键字:数据报 返回 套接字 UDP QT      更新时间:2023-10-16

让我开始说,这比QT问题更可能是UDP配置问题。

我正在使用UBUNTU计算机上使用UDP重播到Windows PC上的PCAP文件。当我通过Wireshark检查UDP数据时,我可以看到每个数据包中的所有关联数据。但是,当我使用QT程序时,我可以通过适当的长度进行数据包,但是数据包内没有数据,只有0。

i具有Windows PC的IP地址,设置为与Ubuntu Source PC以及配置的适当端口在同一子网上。

我本质上正在使用QT多播接收器示例,此处:http://doc.qt.io/qt-5/qtnetwork-multicastreceiver-example.html

有什么想法吗?

编辑:

我对不包括适当的代码表示歉意。

void Receiver::processPendingDatagrams()
 {
    while (udpSocket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(), datagram.size());
        statusLabel->setText(tr("Received datagram: "%1"")
                             .arg(datagram.data()));
    }
}

datagram.data()字节数组简单地填充了零,无论数据包实际包含什么。

想法?

您的代码方便地忽略了readDatagram返回的收到的数据报的大小;这是可能错误的根源。通过使用receiveDatagram改用:

,事情会容易得多。
void Receiver::processPendingDatagrams()
{
  while (udpSocket->hasPendingDatagrams()) {
    auto datagram = udpSocket->receiveDatagram();
    statusLabel->setText(tr("Received datagram: "%1"")
                         .arg(QString::fromLatin1(datagram.data().toHex())));
  }
}

现在,数据报的内容已编码为十六进制,很容易确切地告诉其中它的时间是多长时间。通常,这是一个非常糟糕的主意将不动动的数据报道作为参数传递给字符串输出方法,因为这使得任何UTF-8解码器可能可以利用。使用toHex()保护自己免受此侵害。由于data()此处不是char * data(),而是QByteArray data(),因此显示器将准确显示收到的长度。