【问题标题】:QT UDP Socket Returning Empty DatagramsQT UDP 套接字返回空数据报
【发布时间】:2017-12-05 00:46:39
【问题描述】:

首先让我说这很可能是 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() 字节数组都简单地用零填充。

想法?

【问题讨论】:

  • 不知道为什么这被否决了。老实说,我在这里需要一些帮助。如果可以的话,让我进一步充实这一点。我收到的每个 UDP 数据包的长度为 1375 字节。我收到一个 1375 字节的数据报,但内容全是 0。
  • 我不是反对者,但是...您必须显示相关代码——最好是minimal reproducible example。否则一切都只是猜测。
  • 感谢您的反馈,我已经更新了问题。

标签: c++ qt sockets networking


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多