2012-01-31 13 views
0

私はLinuxの下でBerkely SOCKET APIを使ってTCPサーバを書いています。クライアントは一連の仕様を持ち、クライアントから送信される各メッセージはこれらの仕様に基づいています。つまり、クライアントから送信されたメッセージは、仕様で指定された多くの構造体の1つに対応します。今、シナリオは、サーバーが、クライアントがいつ何時に送信するメッセージか分からないということです。メッセージが出たら、それが何であるかを知ることができます。クライアントから送信されるメッセージは可変長であるため、どのメッセージを受け取るかを事前に知ることはできません。これを解決するために、私は以下の方法を使用している:私はサイズ4096のデフォルトのバッファを使用しているrecv()sysの呼び出しを正しく使う方法

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

を(クライアントからのメッセージは、このサイズよりも大きくなることはできません)。そのバッファに受信し、その後、私はメッセージの種類を確認し、次のように対応するアクションを取る:これは正常に動作しますが、私はちょうどそれが適切な方法それであるかかもしれない何か他のものがあることを確認したかった

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

これよりも良い。すべての助けを非常に感謝します。

ありがとうございました。

答えて

5

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

これは、メッセージのサイズを知り、追加のデータを次のメッセージに組み込む必要があることを意味します。

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

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

+0

はいこれは私が恐れるものです。これに解決策を投稿していただけますか? – Abdullah

+0

編集された回答をご覧ください。 –

+0

おかげさまで、多くの方々に感謝しています。喜んでください:) – Abdullah

関連する問題