0

ゲームのスコアサーバーを実装する割り当てがあります。ゲームが完了すると、ゲームは登録のためにプレーヤーの名前(char * name)とスコア(intスコア)をサーバーに送信し、receive()し、サーバーは5つのトップスコアを送り返します。

BerkeleyソケットとCを使用します。例を読んで調べた後、単一の変数を送信するだけの例しか見つかりません。

write(sd, "Hello World", 12);

char buf[13];
read(sd, buf, 12);
buf[12] = '\0';

何をするのが普通ですか?各変数(名前とスコア)を別々のwrite()関数で送信しますか、それとも両方の変数を保持する構造体を作成しますか?

Beejのネットワークプログラミングガイドを読んだ後、考慮しなければならないバイト順序(ビッグ/リトルエンディアン)の問題に遭遇しました。これはセクション7.4シリアル化-データのパック方法に示されていますが、それ以外は問題ありません。すべてのサンプルコードパッケージで、それらはフロートし、単一の変数ですが、構造体全体をパックする方法はありますか?

クライアントとサーバーがどのように通信するかを説明するプロトコルの作成について説明するセクション7.5Soneof Data Encapsulationもあります。私にとって、これは構造体と私がやらないことのように見えますが、原則を示すコードはありません。


つまり、サーバーとクライアントの間に安定した通信を作成し、単一の変数以上のものを交換したいと考えています。

4

1 に答える 1

1

ネットワーク通信では、変数や構造体の概念はありません。あなたがしているのは、バイトのシーケンスを送信することです。

したがって、構造体を送信するという考え方は、単一の値を送信するのと同じです。構造体をバイトのシーケンスに変換し(シリアル化)、ソケットに書き込み、もう一方の端で、バイトのシーケンスを構造体に変換し直します(デシリアライズ)。

だから今あなたの問題はシリアル化の1つになります:構造体をシリアル化するにはどうすればよいですか?

これは、構造体の個々の値をシリアル化する構成にすぎません。

より一般的なもの

通常、ネットワークトラフィックの量を減らしたいと考えています。したがって、事前に送信するすべてのデータがある場合は、一度に送信する方が、名前とスコアの各ペアを個別に送信してデータを手動でチャンク化するよりも効率的です。

于 2012-11-05T00:26:26.370 に答える