C++ QT UDP套接字返回空数据报
首先让我说,这很可能是UDP配置问题,而不是QT问题 我在ubuntu计算机上使用UDP重播将PCAP文件播放到windows PC。当我通过wireshark检查UDP数据时,我可以看到每个数据包中的所有相关数据。但是,当我使用我的QT程序时,我得到了数据包,具有适当的长度,但数据包中没有数据,只有0 我将Windows PC的IP地址设置为与ubuntu源PC位于同一子网上,并配置了正确的端口 我基本上使用的是QT多播接收器示例,如下所示: 有什么想法吗 编辑: 很抱歉没有包含正确的代码C++ QT UDP套接字返回空数据报,c++,qt,sockets,networking,C++,Qt,Sockets,Networking,首先让我说,这很可能是UDP配置问题,而不是QT问题 我在ubuntu计算机上使用UDP重播将PCAP文件播放到windows PC。当我通过wireshark检查UDP数据时,我可以看到每个数据包中的所有相关数据。但是,当我使用我的QT程序时,我得到了数据包,具有适当的长度,但数据包中没有数据,只有0 我将Windows PC的IP地址设置为与ubuntu源PC位于同一子网上,并配置了正确的端口 我基本上使用的是QT多播接收器示例,如下所示: 有什么想法吗 编辑: 很抱歉没有包含正确的代码 v
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()
,因此显示屏将准确显示接收到的长度。不确定为什么会对其进行否决。我真的需要一些帮助。如果可以的话,让我把这件事再充实一点。我接收的每个UDP数据包的长度为1375字节。我收到一个1375字节的数据报,但内容都是0。我不是一个投票人,但。。。您必须显示相关代码——最好是一个。否则这只是猜测。谢谢你的反馈,我已经更新了问题。