私は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
}
保留中のデータグラムサイズが 'readDatagram()'関数が返すものと等しいかどうかをチェックする価値があります。 – vahancho
あなたは明確にすることができますか? readDatagram()の戻り値がpendingDatagramSize()の戻り値と等しいかどうかを確認する必要がありますか?私はすぐにそうするでしょう。 –
@vahancho問題が発生しているものとそうでないものの両方のメッセージを使用してテストしましたが、保留中のデータグラムサイズはすべての場合に 'readDatagram()'の戻り値に相当します。 –