QT UDP套接字返回空数据报

时间:2017-12-05 00:46:39

标签: c++ qt sockets networking

让我先说这可能是一个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()字节数组都只用零填充。

思想?

1 个答案:

答案 0 :(得分: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(),因此显示屏将准确显示收到的长度。