0

LinuxでBerkelySOCKETAPIを使用してTCPサーバーを作成中です。これで、クライアントには一連の仕様があり、クライアントによって送信される各メッセージはそれらの仕様に基づいています。つまり、クライアントから送信されるメッセージは、仕様で指定された多くの構造体の1つに対応します。ここでのシナリオは、サーバーがクライアントがいつ送信するメッセージを認識していないというものです。メッセージを受け取ったら、それが何であるかを理解できますが、その前には理解できません。クライアントから送信されるメッセージの長さは可変であるため、どのメッセージを受け取るかを事前に知ることはできません。これを解決するために、私は次の方法を使用しました。

const char *buf[4096] = { 0 };
          if ( recv (connected, buf, 4096, 0) == -1)
             {
               printf ("Error in recvng message\n");
               exit (-1);
             }

つまり、サイズ4096のデフォルトのバッファを使用します(クライアントからのメッセージがこのサイズより大きくなることはありません)。そのバッファで受信し、その後、メッセージタイプを確認して、次のように対応するアクションを実行します。

struct ofp_header *oph;
oph=(struct ofp_header *)buf;
switch (oph->type)
{
case example_pkt:
handle_example_pkt();
break;
}

これは問題なく機能しますが、それが適切な方法であるか、これよりも優れている可能性がある他の方法があるかを確認したかっただけです。すべてが大いに感謝するのに役立ちます。

ありがとう。

4

1 に答える 1

5

TCP はストリームベースです。これは、メッセージよりも大きなバッファーを使用すると、次のメッセージの一部も受信する可能性があることを意味します。

これは、メッセージのサイズを把握し、次のメッセージに追加データを組み込む必要があることを意味します。これを行うには、次の 2 つの明白な方法があります。

  1. メッセージの最初の数バイトとして各メッセージのサイズを送信するようにプロトコルを変更します。最初にサイズを読み取り、次にそのバイト数のみを読み取ります。

  2. 各メッセージのサイズはわかっているので、読み取ったバイト数を記録しておいてください。バッファ内の最初のメッセージを処理し、バッファ内の残りのバイトからそのメッセージのサイズを引きます。A. メッセージ タイプを識別するのに十分なバイト数が残っていないか、B. 検出されたタイプのメッセージに十分なバイト数が残っていないかのいずれかになるまで、このプロセスを繰り返し続けます。残りのバイトを保存し、recv を再度呼び出してさらにデータを読み取ります。

于 2012-01-31T14:29:49.360 に答える