0

TCP ソケットからデータを取得する Linux でインターフェイスを作成しています。ユーザーは、受信したデータが格納されるバッファを提供します。提供されたバッファが小さすぎる場合は、エラーを返したいだけです。最初の問題は、バッファが小さすぎたかどうかを判断することです。recv() 関数は、実際にバッファに書き込まれたバイト数を返すだけです。recv() マンページに記載されている MSG_TRUNC フラグを使用しても、同じ結果が返されます。2 番目の問題は、ソケットにまだキューに入れられているデータを破棄することです。したがって、提供された Buffer が小さすぎると判断した場合は、ソケットに残っているものをすべて消去したいだけです。ソケットを閉じて再度開くか、何もなくなるまで受信する以外に、他の方法はありますか? よろしくお願いします

トビー

4

1 に答える 1

1

man ページに記載されているように、MSG_TRUNC はパケット ソケット (UDP など) に対してのみ有効であるため、これはストリーム ベースの TCP ソケットに対しては機能しません。TCP でアプリケーション メッセージ境界を維持することについて話している、stackoverflow などの記事は文字通り何百もあります (ヒント: これは自分で行う必要があります。TCP はバイト ストリーム インターフェイスであり、そうではありません)。 、言うだけで十分です、アプリケーションの「メッセージ」または「パケット」がrecv()側でどれだけ大きいかを知るメカニズムが必要であり、TCPを介して必要なことを実行できるようにする必要があります(またはUDPに切り替える必要があります) .

TCP の場合、ソケットを「ドレイン」する必要がある場合は、データがなくなるまで読み取ることができますが、1 つの「メッセージ」を読み取って食べ始めることがないように、前述のようにメッセージの境界を考慮する必要があります。次へ (繰り返しますが、覚えておくべき最も重要な点は、TCP はバイト ストリーム インターフェイスを提供し、アプリケーション レベルのパケットまたはメッセージの概念を必ずしも保持しないということです)。

于 2011-08-04T18:29:03.443 に答える