9

Linuxで2組のコード(server.cと)を書きました。client.c1つはUNIXドメイン用、もう1つAF_UNIXはインターネットドメイン用AF_INETです。どちらも正常に動作しています!

listen()バックログキューの長さ=3で呼び出されますboth servers

listen(sockfd, 3);  

UNIXドメイン(AF_UNIX) の場合:1つのクライアントがサーバーに接続されているときに、さらに多くのクライアントをサーバーに接続しようとすると。3つはキューに入れられ、4つ目の要求は拒否されます。(私が望むように-待機キューに3つ)。

INTERNETドメイン(AF_INET)の場合: 3つを超える要求は保留中のキューに保持されます。

バックログキューの長さが3の場合でも、4番目のクライアントからの要求が拒否されないのはなぜですか。そして、なぜ(そして他の)プロトコルの振る舞いがlisten()依存しているのですか?

4

2 に答える 2

11

オペレーティングシステムは、実際には、に指定されたものよりも大きなキューを着信TCP接続に使用しますlisten()。どのくらい大きくなるかは、オペレーティングシステムによって異なります。

 listen(int socket_fd, int backlog)  

特定のリスニングソケットに対して、カーネルは2つのキューを維持します。

  1. 不完全な接続キュー-SYNが発生したが、スリーウェイハンドシェイク(TCP)が完全に実行されていない。(SYN_RCV状態)
  2. 完全な接続キュー-スリーウェイハンドシェイクが実行されます。(ESTABLISHED状態)

backlog引数は、歴史的に両方のキューの合計を指定します。しかし、バックログの意味 についての正式な定義はありません。

Berkeleyから派生した実装は、バックログにファッジファクターを追加します。したがって、合計キューlength = factor * backlog

W.リチャードスティーブンスの本で与えられた非常に詳細で深い説明。また、7つのオペレーティングシステムの値を示す表は、Stevens、Fenner、Rudoff、「Unix Network Programming:The Sockets Network API」、第1巻、第3版、108ページにあります。

于 2012-10-15T10:18:27.880 に答える
4

プラットフォームは、最小値とデフォルトに応じて、指定されたバックログを上下に調整する権利があります。最近のデフォルトは、1983年頃に始まった5よりも500のようなものです。指定したものであると信頼することはできず、実際に何であるかを調べるためのAPIもありません。また、明らかなものもありません。デフォルトよりも短くしたいという有効なアプリケーションの理由。

于 2012-10-15T10:19:06.460 に答える