2017-11-20 4 views
-1

私は緯度と経度の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; 
} 

答えて

0

多分愚かな質問は、しかし、あなただけではなく、パディング/アライメントを考慮しなければならないが、また、発注ビット。 μpアーキテクチャが両側で同じであることがわかっている場合は、後者の点をスキップできます。 TCPの古い彼らは追加の時代から:あなたは同じローカルマシン上にしようとした場合ように

uint32_t htonl(uint32_t host32bitvalue) ; 

と..

は(すなわち127.0.0.1)、それは動作しますか?

+0

私は私が最終的にWiresharkの中の値のいずれかを見ることができると確信しているが、私はこれをしようとします。私がアライメント/パディングのために問題になっているのは、3つの浮動小数点数または2倍の値をメッセージの隣に置いたときです。私は特定のビット位置で私のUDPメッセージ内のすべてのデータを見ることができ、確かに言うことができる、私はそれらをそこに置くので、32ビットまたは64ビットは私の緯​​度の浮動小数点数です。シリアライゼーションはこれを解決するだろうか? – Unsavorysauce

+0

シリアル化は別の概念です。 (通常はOOP ..)とにかくstructを使うなら、32または64ビットに整列されます(コンパイラに依存します)。 #pragma alignを使用すると、このような状況で役立ちます。完全な構造体を送信しようとすると、動作しますか? – ingconti

0

私はUnixとWindows 下しようとします。..クライアントとサーバの両方のコードを貼り付け:)

関連する問題