2016-09-29 7 views
2

Linuxでaccept()ソケットのバッファサイズ(SO_RCVBUF、SO_SNDBUF)を正しく設定する方法はありますか?受け入れるソケットのバッファサイズを設定する

明白な答えは、しかし、TCPのmanページ状態、新しく作成されたソケット上にsetsockopt()を呼び出すために、次のようになります。個々の接続で

、ソケットバッファサイズを聞く(2前に設定する必要があります)またはconnect(2)コールを有効にするために呼び出します。詳細は、socket(7)を参照してください。バッファとして理にかなって

はおそらく、作成時に割り当てられ、そのため私は、manページを除いて、それのバッファ・サイズを設定することにより、リスニングソケットの継承のセマンティクスに依存する必要があります(またソケットのこと)が可能

Linuxでは、accept()によって返された新しいソケットは、リスニングソケットからO_NONBLOCKやO_ASYNCなどのファイルステータスフラグを継承しません。この動作は正規のBSDソケット実装とは異なります。ポータブルプログラムはファイル状態フラグの継承やnoninheritanceに依存し、常に明示的に(受け入れるから返されたソケットに必要なすべてのフラグを設定しないでください)

それはするし、それはだかどうかを参照してくださいどのような「ファイル状態フラグ」をクリアではありませんソケットのオプションを含むと読み取り中にa few related stackoverflow questions私は誰も賢明ではありません。

+0

「フラグ」にはソケットバッファサイズは含まれていないと思います。いずれにしても、実際にテストする必要があります。そのためには 'ss -aie'を実行して、バッファサイズなどを確認することができます。リスニングソケットと受け入れられたソケットの両方について見ることができます。 –

+0

@JohnZwinckいいえ、私はそうは思わないでしょうが、それは私が見つけることができるソケットの継承の詳細に最も近いリファレンスです。 – Emjayen

+0

'ファイルステータスフラグが何を参照しているのかははっきりしません'非常に明確です:accept()システムコールは、listen()ソケットからその属性を継承するファイル記述子を実際に割り当てます。継承の大部分はIPスタックを指しています(最初に来て、少なくともこれらのイベントをすべて開始しました)。 – wildplasser

答えて

1

最初の引用は受信バッファにのみ適用され、実際の理由は、> = 64kの場合に接続ハンドシェイク中にウィンドウスケールをネゴシエートできるようにするためです。答えは、実際にはリスニングソケット上に設定することです。受け入れられたソケットによって継承される場所から、それはファイルステータスフラグではありません。

関連する問題