3

localhost:80のリスニングソケットと、telnetlocalhost80を使用して接続しているクライアントを想定します。

問題は、限られた数の同時クライアントのみを受け入れたいということです。1つだけを想定しています。その後、私は単に何も受け入れません。

netstat -aを使用して見た問題は、次のクライアント接続が確立されたことです。はい、私はそれを処理しませんが、システムレベルでは、ESTABLISHEDとして表示され、クライアントはデータを送信でき、おそらくシステムに余分なオーバーヘッドを引き起こす可能性があります。

The only way I see is to continue accepting clients but disconnect them. Am I right?

4

3 に答える 3

4

このlisten()関数にはbacklog、オペレーティング システム カーネル内でサーバーからの待機を待機できる未処理のソケットの数を指定するパラメーターがありますaccept()

私の Linux システムの man ページにlisten()は、ほとんどの場合クライアントでconnection refusedエラーが発生すると書かれています。これは、ソケットがまったくリッスンしていない場合と同じです。

1 つの接続だけを処理したい場合は、それで問題ありません。次のようにするだけです。

listen(s, 0);
while ((new_fd = accept(s)) >= 0) {
    process(new_fd);
}

複数を処理したい場合は、やや難しいでしょう。backlogパラメータは、すでにアクティブな接続数を考慮していないため、パラメータを同時接続数に設定することはできません。

于 2009-01-22T00:05:47.703 に答える
1

そのポートでリッスンを停止すると、それ以上の着信接続が許可されなくなります。最初の接続を受け入れた後、リスナーが閉じていることを確認してください。

その他の 2 つのオプション:

Raw ソケットを使用します (OS がサポートしている場合)。また、TCP 接続を手動で処理します。ただし、これには多くの余分なコードと処理が含まれます。

UDP を使用します。それらはステートレス接続ですが、他の何かに基づいてパケットを受け入れ/拒否する必要があります。ただし、これには TCP 接続のオーバーヘッドはありません。また、telnet などをテストに使用することもできません。

于 2009-01-22T00:05:32.507 に答える
0

これ以上接続を受け入れたくない場合は、リスニング ソケットを単純に閉じ、接続を受け入れたい場合は再度開く必要があります。リッスン バックログは、TCP/IP スタックが受け入れたがアプリケーション プログラムがまだ受け入れていない「ハーフ オープン」接続のためのものであるため、まったく役に立ちません。

于 2009-01-25T11:49:42.007 に答える