2017-07-27 3 views
1

Ich habe ein Problem mit QUdpSockets.Qt Datagramm falsche Daten

Unten ist der Code für meine Implementierung der Socket-Initialisierung und Datagramm lesen. Pakete werden in den meisten Anwendungsfällen fehlerfrei gelesen, aber ALLE Pakete der Längen 11-13 (einschließlich) werden falsch interpretiert.

Ich habe WireShark angeschlossen und verifiziert, dass die Pakete korrekt übertragen werden. In allen Fällen dieser Beschädigung werden die gleichen Daten empfangen: Für Pakete 11-Bytes: Die ersten sieben Bytes werden korrekt gelesen, und die letzten vier Bytes sind (egal was der übertragene Inhalt war), in Dezimal: .

Für Pakete 12-Byte: Die ersten acht Bytes werden korrekt gelesen, was bedeutet, dass sich das Problem verschiebt: Die letzten vier Bytes sind 36 255 67 70.

Für Pakete 13-Bytes: Die ersten NEIN-Bytes werden korrekt gelesen, eine weitere Verschiebung: die letzten vier Bytes sind 255 67 70 70.

Für Pakete 14-Byte: Die Daten stimmen überein, was in Wireshark erfasst wird.

Ich verwende Qt 4.7.3 für ein Embedded-System und verwende den 2014.4 Xilinx-linux-gnueabi-gcc-Compiler von xilinx-linux-gnueabi-gcc 2014.4, um das Embedded-Gerät zu kompilieren.

Im Folgenden finden Sie den relevanten Code, wobei einige der Variablendeklarationen in einem globalen Gültigkeitsbereich ausgeführt werden. Es sollte leicht genug sein, Sinn zu machen, aber wenn irgendwelche Zeilen verwirrend sind, lass es mich wissen.

Jede Hilfe zu verstehen, warum meine Pakete beschädigt werden (und nur in dieser bestimmten Länge) wäre wunderbar. Vielen Dank im Voraus für Ihre Zeit.

//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

Es lohnt sich zu prüfen, ob die anstehende Datagrammgröße gleich ist, was die Funktion 'readDatagram()' zurückgibt. – vahancho

+0

Können Sie klären? Willst du sagen, dass ich überprüfen sollte, ob der Rückgabewert von readDatagram() gleich dem Rückgabewert von pendingDatagramSize() ist? Ich werde es sofort tun. –

+0

@vahancho Ich habe mit ein paar Nachrichten getestet, sowohl diejenigen, die Probleme haben und denen, die nicht sind, und schwebende Datagrammgröße ist in allen Fällen dem Rückgabewert von 'readDatagram()' äquivalent. –

Antwort

0

Nachdem eine Vielzahl von Variablen zu ändern (das Gerät I Pakete sendete an, welche Sprache und Strukturen wurde ich von Qt zu grundlegenden C nach Java verwenden, das Ethernet-Kabel verwendet, usw.) entdeckte ich, das Problem liegt in meine Netzwerkhardware auf meiner Maschine.

Nach dem Umschalten auf eine andere Maschine und Senden der gleichen Pakete, übertragen sie fehlerfrei.