-1

学期末プロジェクトの一環として、分散型チャット システムを実装する必要があります。システムはスケーラブルで堅牢である必要があります。これらの基準を念頭に置いて、ソケットを介してベクトル オブジェクトを送信する方法について混乱しています。

ベクトルは動的に割り当てられるため、そのオブジェクトをそのまま送信しても、それが指すメモリがコピーされないため機能しません。このシリアライゼーションを実現するには、最適なオプションです。ただし、私たちのプロジェクトで必要なため、Boost や Google Protocol Buffers などのサードパーティ ライブラリを使用することは想定していません。

したがって、ベクターオブジェクトをシリアル化してネットワーク経由で送信するには、続行方法を説明する開始ガイドが見つからないようです。また、これに使用できる他の代替手段はありますか?

ベクトルには、チャット グループの各メンバーの文字列 (IP アドレス:ポート) が含まれます。

どんな助けでも素晴らしいでしょう。ありがとうございました。

注: チャット クライアントをクラスターで実行する必要があります。システムを堅牢でスケーラブルにするためには、エンディアンも考慮する必要があると思います。

4

1 に答える 1

0

この場合にバイナリ シリアル化が必要な場合は、整数と文字列の 2 つの型のシリアル化を実装する必要があります。整数は、char にキャストしてからシフトすることで、バイトごとに簡単に書き込むことができます。

// assuming 32 bit ints and 8 bit bytes
int integer = 1337;
unsigned char data[4];
for(int i = 0; i < 4; ++i)
    data[i] = (unsigned char) (integer >> 8*i);

合計とシフトによって逆シリアル化します。

int integer = 0;
for(int i = 3; i >= 0; ++i)
{
    integer += data[i];
    integer <<= 8;
}

(私はコードをテストしなかったので、デバッガーでトレースして、私が思うように動作することを確認してください:))

シリアル化された文字列は、シリアル化されたサイズになり、ストリーム上の文字になります。

ベクトルは、これら2つの組み合わせになります-ベクトルのサイズ、次に文字列を1つずつ。

マジック ワードとチェックサムを追加して、クライアントが期待する内容とデータの検証方法を確実に認識できるようにすることができます。本当に凝ったものにしたい場合は、ASN.1 などの独自のバッキングを実装してください。:)

于 2012-04-08T19:55:29.527 に答える