2

Windows で実行されているプログラムと Unix で実行されている他のプログラムの間で、インターネット ソケットを介してデータ構造 (つまり、バイナリ形式) を渡す方法があるかどうか教えてください。

それを扱う資料へのアイデアやリンクは非常に高く評価されます。ご協力ありがとうございます、Mk

4

5 に答える 5

6

データをシリアル化する高速な方法として、Google のプロトコル バッファを確認してください。

于 2009-11-13T02:52:26.167 に答える
4

テキストのシリアル化に反対で、構造体が本当に必要な場合は、構造体内のすべてのフィールドに対して、送信時に「ホストからネットワーク」、受信時に「ネットワークからホスト」を使用するほとんどのネットワーク プロトコルと同様に行います。アイデアは、エンディアンに関係なく、すべての送信者が常にネットワークに変換されるということです(ビッグエンディアンはどれがどれか忘れました)。次に、すべての受信者は、それらが何であれ変換されます(変更されないビッグエンディアンの場合もあります)。

これにはすでにAPIがあります。それらは ntohs (ネットワークからホストへの 16 ビット フィールドの略) と ntohl (32 ビット フィールド) です。それからもちろんhtonsとhtonl。

したがって、次のような構造体の場合:

typedef struct
{
    unsigned char  stuff1;
    unsigned char  stuff2;
    unsigned short stuff3;
    unsigned int   stuff4;
}tFoo;

送信コードは次のようになります。

tFoo to_send;
to_send.stuff1 = local_stuff1;
to_send.stuff2 = local_stuff2;
to_send.stuff3 = htons(local_stuff3);
to_send.stuff4 = htonl(local_stuff4);

受信コードは次のようになります。

local_stuff3 = ntohs(from.stuff3);
local_stuff4 = ntohl(from.stuff4);

構造体のパッキング/アライメントの問題に注意してください。コンパイラーごとに常に同じであるとは限らないアライメントにうんざりしている必要があります。異なる cpu アーキテクチャーの同じコンパイラーであっても同じです。データ型自体を変更することもできます (int は、アーチごとに同じサイズではない場合があります)。私は、最初の 2 つの 8 ビット文字でビットを示し、その後に 16 ビットと 32 ビットで合計 8 バイトであることを実証しようとしました。別のコンパイラ/アーキテクチャに移植するときは、実際に正しいパッキング/サイズを取得していることを確認する必要があります。

そのため、ほとんどの人がシリアル化を選択し、おそらくほとんどの人がそれを選択した理由です。これは、最もエラーが発生しにくい方法です。

幸運を。

于 2009-11-13T03:53:47.750 に答える
4

はい、あなたが探しているのは、ある種のシリアライゼーションです。これを行うには、次のような多くの方法があります。

通常、これを支援するためにライブラリを使用します。また、プログラムにリンクするためのコードを生成するツールに遭遇する場合もあります。

于 2009-11-13T02:54:34.447 に答える
1

Boost シリアライゼーションは良い選択のようです。

于 2009-11-13T02:56:50.323 に答える
0

バイナリ形式が要求されましたが、この種のものをデバッグしたい場合は、人間として読むことができるテキスト形式があると非常に役立ちます。そのため、XML やおそらく JSON の提案が適切である可能性があります。ほとんどのシステムと言語には、それらの両方を読み書きするための便利な無料ライブラリがあり、多くの場合、XML が組み込まれています。これは、よくテストされ、統合され、パフォーマンスが高いことを意味する傾向もあります。

于 2009-11-13T03:05:27.817 に答える