listen() はバックログ引数を無視しますか? 質問する

listen() はバックログ引数を無視しますか? 質問する

次のような問題があります:

私は持っているsockfd = socket(AF_INET, SOCK_STREAM, 0)

ソケットをセットアップしてバインドした後 ( を使用するとしますsockfd.sin_port = htons(666))、すぐに次の操作を実行します。

listen(sockfd, 3);

sleep(50); // for test purposes

バックログ引数をテストするために 50 秒間スリープしていますが、ポート 666 で 3 回以上接続*を確立できるため、無視されているようです。

*: つまり、クライアントから送信され、破棄されるのではなく、listen キューに置かれた N 番目の SYN (n>3) ごとに syn/ack が返されるということです。何が間違っているのでしょうか? listen(2) と tcp(7) のマニュアル ページを読んで、次のことがわかりました。

TCP ソケットの backlog 引数の動作は Linux 2.2 で変更されました。現在では、不完全な接続要求の数ではなく、受け入れを待機している完全に確立されたソケットのキューの長さを指定します。不完全なソケットのキューの最大長は、/proc/sys/net/ipv4/tcp_max_syn_backlog を使用して設定できます。syncookies が有効になっている場合、論理的な最大長は存在せず、この設定は無視されます。詳細については、tcp(7) を参照してください。

ですが、sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2とを使っても同じ結果になります。何かが足りないか、のバックログの目的をsysctl -w net.ipv4.tcp_syncookies=0完全に誤解しているに違いありません。listen()

ベストアンサー1

バックログ引数はlisten()あくまでも参考です。

POSIXによれば:

バックログの議論は、ヒント実装では、ソケットの listen キュー内の未処理の接続数を制限するためにこれを使用します。

現在のLinuxカーネルのバージョンでは、最小16で2のべき乗に切り上げられます。関連するコードは次のとおりです。リクエストキュー割り当て()

おすすめ記事