私は緯度と経度の32ビットスケール整数、xyとz速度の32ビット浮動小数点数、いくつかの1ビットフラグを含むデータを持っています。私もUDP上で少なくとも1つのダブルを正常に送信していますが、もう片方とWiresharkではゴミ箱に見えます。 UDP経由でデータを送信するたびにデータをビットごとに切り替えて変更する必要があります。メッセージフォーマットはシンプルで、各データタイプはそのサイズをとり、特定の開始ビットを持ちます。私はシリアル化する必要があるようだが、反対側では必ずしもデシリアライズが可能ではない?私の最初の考えは、すべてのデータを含む構造を作り、UDP上で構造全体を送信することでしたが、パディングは間違っていました。メッセージは64バイト長である必要があり、各データ型は開始ビットとフォーマットの長さを持ちます。このコードはコンパイルされて動作しますが、受信側では判読できない緯度で動作します。 Lat、long、altは毎秒更新されます。より多くのデータフィールドがありますが、私は小さいものから始めようとしています。フォーマットのスニペットは、データタイプ、単語の位置、その単語内の開始ビット、およびビットの長さが添付され、lat、longおよびaltはメッセージ内の他の場所にあります。 Data Format今、最良のアイデアはCereal(http://uscilab.github.io/cereal/index.html)ですが、それが致命的なものかどうかはわかりません。バイナリデータを送信する際にC++/Visual Studioで与えられたデータフォーマット(倍精度、浮動小数点、整数、1ビットのbool)を持つUDPでデータを送信する最も良い方法はありますか?シリアライゼーション?
struct TSPIstruct //
{
double Latitude;
double Longitude;
double Altitude;
};
void SendDataUDP(double latitude, double longitude, double altitude)
{
TSPIstruct TSPI;
TSPI = CompileTSPI(latitude, longitude, altitude);
//printf("\n\r");
printf("Sending GPS over UDP at %d", LastSystemTime);
printf("\n\r");
printf("\n\r");
//send the message
if (sendto(s, (char*)&(TSPI.Latitude), sizeof(double) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
{
printf("sendto() failed with error code : %d" , WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("UDP packet sent, latitude is %f", TSPI.Latitude);
printf("\n\r");
printf("\n\r");
}
TSPIstruct CompileTSPI(double latitude, double longitude, double altitude)
{
TSPIstruct TSPI;
TSPI.Latitude = latitude;
TSPI.Longitude = longitude;
TSPI.Altitude = altitude;
return TSPI;
}
私は私が最終的にWiresharkの中の値のいずれかを見ることができると確信しているが、私はこれをしようとします。私がアライメント/パディングのために問題になっているのは、3つの浮動小数点数または2倍の値をメッセージの隣に置いたときです。私は特定のビット位置で私のUDPメッセージ内のすべてのデータを見ることができ、確かに言うことができる、私はそれらをそこに置くので、32ビットまたは64ビットは私の緯度の浮動小数点数です。シリアライゼーションはこれを解決するだろうか? – Unsavorysauce
シリアル化は別の概念です。 (通常はOOP ..)とにかくstructを使うなら、32または64ビットに整列されます(コンパイラに依存します)。 #pragma alignを使用すると、このような状況で役立ちます。完全な構造体を送信しようとすると、動作しますか? – ingconti