-2

Cには、単純なサーバー/クライアントUDPソケットプログラミングの例があります。クライアントはパケットをサーバーに高速で送信し、サーバーは各着信メッセージを読み取ってクライアントに送り返します。クライアントが着信メッセージを読み取ることはありません。

クライアントに返送されたパケットがクライアントのバッファをいっぱいにするだろうと信じる理由はありますか?クライアントが何も読まない場合、実際に彼らはどうなりますか?彼らはすぐに落とされますか?

4

2 に答える 2

6

カーネルは、アプリケーションがパケットを読み取ることを期待して、パケットをソケットの受信バッファに入れます。そのバッファがいっぱいになると、カーネルは新しいデータグラムのドロップを開始します。

于 2012-11-26T17:44:40.057 に答える
5

カーネルは、着信パケットをある制限までキューに入れます。これは、SO_RCVBUFソケットオプションを設定することにより、クライアントで制御できる場合があります。制限に達すると、追加のパケットがドロップされ、カーネルは送信元クエンチICMPメッセージを送信者に送り返す場合があります。ソケットごとにそれを制御する標準的な方法はありません。ソースクエンチメッセージが送信された場合、IP_RECVERRソケットオプションを使用してサーバー上でそれらを読み取ることができる場合があります。

何もしなければ、ソースクエンチメッセージ(送信された場合)はおそらく無視されますが、サーバーのカーネルが送信ソケットでエラーをトリガーする可能性があります。しかし、私はそのようなことをするOSを知りません。

一般に、不要なデータの送信は無駄であり、実行すべきではありません。クライアントパケットには、クライアントが応答を期待しているかどうかをサーバーに通知する1ビットが含まれている可能性があるため、問題全体を回避できます。

于 2012-11-26T18:03:21.293 に答える