4

一般的なソケットプログラミングの質問があります。

DataというC構造体があります。

struct data {
      double speed;
      double length; 
      char carName[32];
      struct Attribs;
}

struct Attribs {
      int color;
}

Javaで同様の構造を作成し、ソケットを作成し、上記の構造体を使用してデータパケットを作成し、それをC++ソケットリスナーに送信できるようにしたいと思います。

シリアル化されたデータ(基本的に、パケットで転送される1と0)について教えてください。C ++はこれらのパケットをどのように「読み取り」、構造体を再作成しますか?このような構造体はどのようにパケットに格納されますか?

一般的に、そのような問題を解決する方法について私にアイデアを与えるためにあなたが私に言うことができるものは何でも。

ありがとう!

4

2 に答える 2

2
  • バイナリシリアル化を使用する場合は、エンディアンにうんざりしてください。SunのJVMはビッグエンディアンであり、Intel x86を使用している場合は、リトルエンディアンのマシンを使用しています。
  • 高速なネイティブシリアル化には、JavaのByteBufferを使用します。ByteBuffersはNIOライブラリの一部であるため、おそらく古いDataInput/OutputStreamsよりもパフォーマンスが高くなります。
  • フロートのシリアル化には特にうんざりしてください!上で示唆したように、すべてのデータをネットワークを介して文字列に転送する方が安全です。
  • C ++側では、ネットワークに関係なく、ある時点でデータのバッファがいっぱいになります。したがって、逆シリアル化コードは次のようになります。

size_t amount_read = 0;
data my_data;
memcpy(buffer+amount_read, &my_data.speed, sizeof(my_data.speed))
amount_read += sizeof(my_data.speed)
memcpy(buffer+amount_read, &my_data.length, sizeof(my_data.length))
amount_read += sizeof(my_data.length)
  • 基本的なC++型のサイズは実装によって定義されているため、JavaおよびC++のプリミティブ型は直接変換されないことに注意してください。
  • Googleプロトコルバッファを使用できます。さまざまなデータ構造を扱う場合の私の好ましい解決策。
  • シリアル化にもJSONを使用できます。
于 2010-08-05T22:21:53.780 に答える
0

基本的なプロセスは次のとおりです。

  • Java アプリは、XML など、Java アプリ内の構造体の移植可能なバージョンを作成します。
  • Java アプリが XML をソケット経由で C++ アプリに送信する
  • C++ アプリが Java アプリから XML を受け取る
  • C++ アプリは、XML メッセージ内のデータを使用して構造体のインスタンスを作成します
于 2010-08-05T21:34:06.120 に答える