QT UDP套接字返回空数据报

问题描述 投票:0回答:1

让我先说这可能是一个UDP配置问题,而不是QT问题。

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

我将Windows PC的IP地址设置为与ubuntu源PC在同一子网上,以及配置的正确端口。

我基本上使用的是QT Multicast Receiver示例,这里是: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()字节数组都只用零填充。

思考?

c++ qt sockets networking
1个回答
0
投票

您的代码方便地忽略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(),显示器将准确显示收到的长度。

© www.soinside.com 2019 - 2024. All rights reserved.