Qt数据报错误数据
Qt datagram wrong data
我在使用 QUdpSockets 时遇到问题。
下面是我实现socket初始化和数据报读取的代码。在大多数用例中,数据包读取无误,但所有长度为 11-13(含)的数据包都被错误解释。
我已连接 WireShark 并验证数据包正在正确传输。在这种损坏的所有情况下,都会收到相同的数据:
对于 11 字节的数据包:前 7 个字节被正确读取,最后 4 个字节(无论传输的内容是什么),十进制:147 36 255 67
.
对于 12 字节的数据包:前八个字节被正确读取,这意味着问题发生了变化:最后四个字节是 36 255 67 70
.
对于 13 字节的数据包:前 9 个字节被正确读取,另一个移位:最后四个字节是 255 67 70 70
。
对于 14 字节的数据包:数据与 Wireshark 中捕获的数据匹配。
我正在为嵌入式系统使用Qt 4.7.3,并使用2014.4 Xilinx SDK 的arm-xilinx-linux-gnueabi-gcc 编译器为嵌入式设备进行交叉编译。
下面是相关代码,其中一些变量声明是在全局范围内完成的。它应该很容易理解,但如果有任何行令人困惑,请告诉我。
任何帮助理解为什么我的数据包被损坏(并且只在特定长度)的帮助都会很棒。预先感谢您的宝贵时间。
//initialization method for all ethernet communication
//runs once at launch
void MainWindow::initEthernet()
{
connect(&primaryServerSocket, SIGNAL(readyRead()),
this, SLOT(handleEthernet()));
connect(&backupServerSocket, SIGNAL(readyRead()),
this, SLOT(handleEthernet()));
primaryServerSocket.bind(selfAddress, selfPort, QUdpSocket::ShareAddress);
backupServerSocket.bind(selfAddress, selfPort, QUdpSocket::ShareAddress);
}
void MainWindow::handleEthernet()
{
//determine where received data came from
QUdpSocket * sender = qobject_cast<QUdpSocket*>(this->sender());
//int keypadNumber = sender - keypadPorts;
QByteArray data;
data.resize(sender->pendingDatagramSize());
sender->readDatagram(data.data(), data.size());
//THOUGHT: Datagrams come as complete packages. No buffer appending is necessary.
//List of messages to send back
QList<QByteArray> responseToSend;
//print the raw message, as well as ascii and int values for each byte
QString error = data.data();
error.append("\n");
for(int i = 0; i < data.size(); i++)
{
error.append(data.at(i));
error.append(" ");
error.append(QString::number((int) data.at(i)));
error.append("\n");
}
showErrorMessage(error); //this prints a message to screen
}
在更改了无数变量之后(我向其发送数据包的设备、我使用的语言和结构从 Qt 到基本 C 再到 Java、使用的以太网电缆等)我发现了问题位于我机器上的网络硬件中。
切换到另一台机器并发送相同的数据包后,它们传输无误。
我在使用 QUdpSockets 时遇到问题。
下面是我实现socket初始化和数据报读取的代码。在大多数用例中,数据包读取无误,但所有长度为 11-13(含)的数据包都被错误解释。
我已连接 WireShark 并验证数据包正在正确传输。在这种损坏的所有情况下,都会收到相同的数据:
对于 11 字节的数据包:前 7 个字节被正确读取,最后 4 个字节(无论传输的内容是什么),十进制:147 36 255 67
.
对于 12 字节的数据包:前八个字节被正确读取,这意味着问题发生了变化:最后四个字节是 36 255 67 70
.
对于 13 字节的数据包:前 9 个字节被正确读取,另一个移位:最后四个字节是 255 67 70 70
。
对于 14 字节的数据包:数据与 Wireshark 中捕获的数据匹配。
我正在为嵌入式系统使用Qt 4.7.3,并使用2014.4 Xilinx SDK 的arm-xilinx-linux-gnueabi-gcc 编译器为嵌入式设备进行交叉编译。
下面是相关代码,其中一些变量声明是在全局范围内完成的。它应该很容易理解,但如果有任何行令人困惑,请告诉我。
任何帮助理解为什么我的数据包被损坏(并且只在特定长度)的帮助都会很棒。预先感谢您的宝贵时间。
//initialization method for all ethernet communication
//runs once at launch
void MainWindow::initEthernet()
{
connect(&primaryServerSocket, SIGNAL(readyRead()),
this, SLOT(handleEthernet()));
connect(&backupServerSocket, SIGNAL(readyRead()),
this, SLOT(handleEthernet()));
primaryServerSocket.bind(selfAddress, selfPort, QUdpSocket::ShareAddress);
backupServerSocket.bind(selfAddress, selfPort, QUdpSocket::ShareAddress);
}
void MainWindow::handleEthernet()
{
//determine where received data came from
QUdpSocket * sender = qobject_cast<QUdpSocket*>(this->sender());
//int keypadNumber = sender - keypadPorts;
QByteArray data;
data.resize(sender->pendingDatagramSize());
sender->readDatagram(data.data(), data.size());
//THOUGHT: Datagrams come as complete packages. No buffer appending is necessary.
//List of messages to send back
QList<QByteArray> responseToSend;
//print the raw message, as well as ascii and int values for each byte
QString error = data.data();
error.append("\n");
for(int i = 0; i < data.size(); i++)
{
error.append(data.at(i));
error.append(" ");
error.append(QString::number((int) data.at(i)));
error.append("\n");
}
showErrorMessage(error); //this prints a message to screen
}
在更改了无数变量之后(我向其发送数据包的设备、我使用的语言和结构从 Qt 到基本 C 再到 Java、使用的以太网电缆等)我发现了问题位于我机器上的网络硬件中。
切换到另一台机器并发送相同的数据包后,它们传输无误。