1

サーバー用のテストプログラムを作成しています。テストアプリでは、多数のクライアントをサーバーに接続しようとしますが、しばらくすると、次のようなあらゆる種類のエラーが発生します。

Connection reset by peer: socket write error                   

また

java.net.SocketException: Connection reset                     

また

java.net.ConnectException: Connection refused: connect

サーバーに接続するすべてのクライアントに新しいソケットを使用します。

誰かがこの奇妙な行動について私に教えてもらえますか?

4

3 に答える 3

0

Web /アプリサーバーは、一度に限られた数のクライアントにしかサービスを提供できません。

この制限に達すると、接続が拒否/リセットされます。

それがあなたの質問に答えることを願っています。

乾杯

于 2009-06-26T10:51:45.933 に答える
0

OSとWebサーバーには、開始/受け入れることができる接続の速度と数に制限があります。サーバーでパフォーマンステストを実行する場合は、これらの制限に対するソリューションがあるApacheJMeterを試してください。

于 2009-06-22T18:11:34.253 に答える
0

残念ながら、サーバーの性質の詳細をあまり提供していません。あなたは典型的なTCPサーバーを書いていると思います。この回答では、Java 固有の詳細については触れません。

簡単なアドバイスは、クライアント接続間に遅延を挿入することです。それがなければ、サーバーへの DoS 攻撃を積極的にシミュレートしています。

長いものについては、以下をお読みください。

通常、TCP サーバーは、(素敵な C インターフェイスで) 関数を呼び出し、その結果 (この場合) をand関数に渡すことによって、リッスンソックスを 1 つだけ作成します。この準備の後、サーバーは、(ソケットがブロッキングとしてマークされている場合) サーバーをスリープ状態にする を呼び出し、地球の反対側のクライアントが関数の呼び出しを開始する場合は、 (サーバー側で)よりもOS カーネルのサポートにより、接続されたソケットが作成されます。int sockfd = socket(...)sockfdbind()listen()accept()connect()accept()

可能な保留接続の実際の数は、関数を見ることで知ることができlisten()ます。OSカーネルがソケットにキューイングする必要がある接続の最大数を定義listen()するバックログパラメータがあります(これは基本的に、および状態のすべての接続の合計です)。歴史的に、1980 年代のバックログの推奨値は 5 程度でしたが、これは現代では明らかに惨めです。たとえば、FreeBSD 7.2 では、次のように入力して、バックログのハード リミットを推測できます。SYN_RCVDESTABLISHED

% sysctl kern.ipc.somaxconn
kern.ipc.somaxconn: 128

そしてFedora 10では:

% cat /proc/sys/net/core/somaxconn
128

PS
私のひどい英語でごめんなさい。

于 2009-06-29T21:00:30.543 に答える