我遇到了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
}
答案 0 :(得分:0)
在更改了无数变量(我发送数据包的设备,从Qt使用的语言和结构到基本的C到Java,使用的以太网电缆等)后,我发现问题在于我机器上的网络硬件。
切换到另一台机器并发送相同的数据包后,它们无错传输。