2017-07-27 5 views
1

私はQUdpSocketsに問題があります。Qtデータグラム間違ったデータ

以下は、ソケットの初期化とデータグラムの読み込みのコードです。パケットはほとんどのユースケースでエラーフリーですが、長さ11〜13(両端を含む)のすべてのパケットが正しく解釈されません。

私はWireSharkに接続し、パケットが正しく送信されていることを確認しました。 パケットの場合11バイト:最初の7バイトは正しく読み取られ、最後の4バイトは(送信されたコンテンツの内容に関係なく)10進数:147 36 255 67です。

パケットの場合12バイト:最初の8バイトが正しく読み取られ、問題がシフトします。最後の4バイトは36 255 67 70です。

パケットの場合13バイト:最初のNINEバイトは正しく読み取られ、別のシフトは最後の4バイトが255 67 70 70です。

パケットの場合14バイト:データはWiresharkでキャプチャされたものと一致します。

私はQt 4.7.3を組み込みシステムに使用し、2014.4ザイリンクスSDKのarm-xilinx-linux-gnueabi-gccコンパイラを使用して組み込みデバイスをクロスコンパイルしています。

以下は関連するコードです。いくつかの変数宣言はグローバルスコープで行われます。意味が分かりやすいはずですが、混乱している行がある場合は教えてください。

なぜ私のパケットが壊れているのか(そしてその特定の長さでのみ)、すばらしいことを理解する助けとなります。あなたの時間のために事前にありがとうございます。変数の無数の変更後は(私はにパケットを送信したデバイス、どのような言語と私はJavaへの基本的なCにQtのから使用していた構造物を、イーサネットケーブルを使用するなど)を

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

保留中のデータグラムサイズが 'readDatagram()'関数が返すものと等しいかどうかをチェックする価値があります。 – vahancho

+0

あなたは明確にすることができますか? readDatagram()の戻り値がpendingDatagramSize()の戻り値と等しいかどうかを確認する必要がありますか?私はすぐにそうするでしょう。 –

+0

@vahancho問題が発生しているものとそうでないものの両方のメッセージを使用してテストしましたが、保留中のデータグラムサイズはすべての場合に 'readDatagram()'の戻り値に相当します。 –

答えて

0

私はこの問題は、内にある発見しました自分のマシン上のネットワークハードウェア

別のマシンに切り替えて同じパケットを送信した後、それらはエラーなしで送信します。

関連する問題