6

私が理解しているように、バックログは接続キューのサイズを決定します。その時点でこのサイズを超える追加のリクエストはすべて破棄されます(このステートメントは正しいですか??)。

今、私は非常に単純なプログラムserver.cを持っています

socket()
bind()
listen(..., 5)
while(1)
{
  accept()
  read()
  write()
  sleep(3)
  close()
}

今、私はこのサーバーに接続するために一度に8つのクライアントを起動します。驚いたことに、サーバーは8つのクライアントすべてにサービスを提供しますが、代わりに5つのクライアントのみをキューに入れ、残りの3つのクライアントの要求は拒否する必要があります。もう1つの興味深い点は、このバックログ値を0として設定しても、結果は同じであるということです。次に、listen()呼び出しにコメントを付けてみましたが、これにより8つのクライアント接続すべてが拒否されます。

誰かがこれに関する入力を提供できますか?

4

1 に答える 1

4

backlog 引数は、キューのサイズに関するヒントです。したがって、あなたが求めていることをするためにそれを当てにすることはできません。

listen()

この答えはそれをカバーしているようです。

詳細については、Ubuntu システムの listen(2) man ページからの引用です。

backlog 引数は、sockfd の保留中の接続のキューが大きくなる可能性のある最大長を定義します。キューがいっぱいのときに接続要求が到着すると、クライアントは ECONNREFUSED を示すエラーを受け取るか、基になるプロトコルが再送信をサポートしている場合は、後で接続を再試行できるように要求が無視されることがあります。

どこでも「かもしれない」と書かれていることに注意してください。

于 2012-05-25T06:40:20.980 に答える