2011-08-04 7 views
1

LinuxでTCPソケットからデータを取得するインターフェイスを作成しています。ユーザは、受信したデータが格納されるバッファを提供する。提供されたバッファが小さい場合、私はエラーを返すだけです。第1の問題は、バッファが小さいかどうかを判断することです。 recv()関数はバッファに実際に書き込まれたバイト数を返します。 recv()のマンページに記載されているMSG_TRUNCフラグを使用すると、それでも私には同じものが返されます。第2の問題は、まだソケットに入れられているデータを破棄することです。私の提供するバッファが小さくて済むと判断したら、ソケットに残っているものをすべて消去したいだけです。閉じてソケットをもう一度開くか、何も残らないうちに受信する以外の方法はありますか?最高の敬具<ソケットにデータが残っているかどうかを確認して破棄します。

1つの提案は、何も残されない(私は0が返される)までrecvすることです - しかし、それはプリセットタイムアウト(この場合は5秒ですか? recvそれはデータまたはタイムアウトを待っていますか?

+0

説明/説明ビットは不要です。あなたの質問をしてください。 – vezult

+0

元の投稿へのリンクを教えてください。 – jweyrich

答えて

4

アプリケーションプロトコルメッセージを構成するものについてTCPレベルでの知識はありません。

  • プレフィックスそのサイズを持つメッセージとそのバイト数を読み、あるいはバイトの特定のシーケンスまで
  • 読み取り発見された:TCPストリームでメッセージを区切るには、2つの最も一般的な方法は、しかし、があります。この光で

は二つの読み出し機能を提供する必要があり、一般的なTCPリーダは普遍的に有用であることが:Nバイトを読み

  • 、及び
  • は、区切り文字が読み取られたまで読み取ること

Tornado IOStream読み込み機能と同様のデザインになります。

1

デザインに欠陥があります。

クライアントが小さすぎるバッファを提供する場合、破棄するデータ量をどのように知っていますか?あなたがメッセージの終わりに達したときにあなたに捨てられることを知らせる何かがデータにありますか?その場合、これらの境界を検出できるように入力ストリームをコードにバッファリングする必要があります。コードでストリームが未分化のバイトであると見なされる場合、データの破棄をいつ停止するかを原則として認識できないため、質問は意味をなさないものです。 TCPストリームでは、「メッセージ」を区切る組み込みプロトコルがない限り、接続がクローズされるまでは全部または何も出力されません。

関連する問題