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、使用的以太网电缆等)我发现了问题位于我机器上的网络硬件中。

切换到另一台机器并发送相同的数据包后,它们传输无误。