3

node.js と socket.io を使用してゲームを作成しました。すべて正常に動作しますが、このゲーム ソケット サーバーが接続に応答しないことがあります。CLOSE_WAIT[プロセス情報] -> [ファイルと接続] (webmin 内) に移動すると、FIN_WAIT2ステータスとの接続が多数あることがわかります。問題はこれらの接続にあると思います。約 1,000 の接続があるとゲームが失敗するからです。サーバーOSはUbuntu Linux 12.04です。

これらの接続を強制終了したり、最大許容接続数を増やしたりするにはどうすればよいですか?

4

3 に答える 3

1

ジムの回答に追加するには、ソケット接続のクローズのクライアント処理に問題があると思います。クライアントがソケットを適切に閉じていないようです(サーバーが開始したものとクライアントが開始したものの両方)。それがサーバーが非常に多くの待機状態を持っている理由です

于 2013-03-25T19:48:52.353 に答える
1

接続を切断したり、許可される数を増やしたりする必要はありません。接続の一方の側、特にクローズを開始しない側のアプリケーションの欠陥を修正する必要があります。

RFC 793の図 13 を参照してください。プログラムはクローズ シーケンスのステップ 3 にあります。FIN-WAIT-2 に表示されている側は正しく動作しています。クローズを開始し、TCP スタックがネットワーク上に FIN パケットを送信しました。CLOSE-WAIT側に不具合あり。その側の TCP スタックは FIN パケットを受信して​​確認しましたが、アプリケーションは通知できませんでした。リモート側が接続を閉じたことをアプリケーションが検出する方法は、プラットフォームによって異なります。残念ながら、私は年をとっていて、node.js や socket.io を知りません。

C では、ソケットは読み取り可能に見えますが、read() は長さゼロのパケットを返します。アプリケーションがこれを確認すると、close() を呼び出すことが期待されます。node.js または socket.io のドキュメントに同等のものがあります。

見つけたら、ここで自分の質問に答えて、答えを受け入れることを検討してください。

于 2013-03-26T08:32:30.317 に答える
0

Linux には、SO_REUSEADDRソケット パラメータを設定するオプションがあります。同じポートをすぐに再利用できます。ツールセットを知っている人なら、ソケット オプションの設定方法を教えてくれます。あなたはすでにその方法を知っているかもしれません。このツールセットを知りません。

古い Java ドキュメントセットから: http://docs.oracle.com/javase/1.5.0/docs/guide/net/socketOpt.html

于 2013-03-25T19:18:41.700 に答える