Qt数据报错误的数据

时间:2017-07-27 19:05:27

标签: qt udp datagram

我遇到了QUdpSockets问题。

下面是我实现套接字初始化和数据报读取的代码。在大多数用例中,数据包读取没有错误,但长度为11-13(含)的所有数据包的解释都不正确。

我已连接WireShark并验证数据包是否正确传输。在这种损坏的所有情况下,都会收到相同的数据: 对于11字节的数据包:前七个字节被正确读取,最后四个字节是(无论传输的内容是什么),十进制:147 36 255 67

对于12字节的数据包:正确读取第一个EIGHT字节,意味着问题发生了变化:最后四个字节为36 255 67 70

对于13字节的数据包:正确读取第一个NINE字节,另一个移位:最后四个字节为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
}

1 个答案:

答案 0 :(得分:0)

在更改了无数变量(我发送数据包的设备,从Qt使用的语言和结构到基本的C到Java,使用的以太网电缆等)后,我发现问题在于我机器上的网络硬件。

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