2009-02-27 14 views
2

私は.NETでチャットサーバーを構築しています。私は約2000のクライアント接続を開こうとしており、Linksys WRT54GLルータ(トマトファームウェア付き)は毎回死んでしまいます。 Azureusビットトレントクライアントで複数の接続を開いているときも同じことが起こります。Windows Server 2003で使用可能なオープンソケット数の上限は

私は3つの質問を持っている:

  1. は、私はWindows Server 2003で持つことができるオープンソケットの数に制限はありますか?
  2. Linksysのルータは問題がありますか?もしそうなら、より良いハードウェアが推奨されますか?
  3. もっと少ないリソースでよりオープンなクライアント接続を処理できるように、おそらくソケットを共有する方法はありますか?

答えて

2

Raymond Chenには、この種の質問に対する良いアドバイスがあります。OSの制限について質問する必要がある場合は、おそらく間違っていると思われます。 IPプロトコルでは、最大65535ポートしか使用できません。これらのポートの多くは予約されており、一般的な使用には使用できません。あなたのメッセージングプロトコルは、OSの制限が問題にならないように、より詳細に検討する必要があることをお勧めします。私はそのようなシステムを記述する多くの良いリソースがあると確信しています。確かにここには良いアイデアがある人々がいます。

EDIT:スケーラブルチャットサーバーの実装について考えてみましょう。

まず、クライアントが通信できるようにサーバー上の単一のポートを指定します。クライアントがチャット状態(例えば、新規ユーザメッセージ)を更新する必要があるときはいつでも次の手順を実行します

create message packet 
open port to server 
send packet 
close port 

サーバーを次のん:

connection request received 
get packet 
close connection 
process packet 
for each client that requires updating 
    open connection to clients 
    send update packet 
    close connection 

新しいチャットセッションが開始され

、セッションを開始するクライアントは、クライアントのユーザーの詳細と応答用のIPアドレスを持つ「新しいセッション」メッセージをサーバーに送信します。サーバーは新しいチャットセッションを作成し、セッションIDで応答します。次に、クライアントは、ユーザーが入力したメッセージを含むパケットを送信し、サーバーはそれを処理し、同じセッション内の他のクライアントにメッセージを転送します。クライアントはチャットを終了すると、サーバーに「セッション終了」メッセージを送信します。サーバーはセッションからクライアントを削除し、セッションにクライアントがなくなるとセッションを破棄します。

あなたが考えることを望む希望。

+0

を作成します:おかげで、私はあなたが提供されるリンクから関連する記事を見つけることができませんTCPIPが\

  • のHKEY_LOCAL_MACHINE \ SYSTEMの\ CURRENTCONTROLSETの\サービス。 1つのボックスから最大50kを得ることができれば、あなたが自分で使ったこれらの優れたリソースの1つを教えてください。ありがとう –

  • +0

    サイトではシステムのことについて多くのことを話していますが、時には上記の声明で通常答えられるシステムの制限についてのコメントがあります。 50k接続が必要な場合、50001が必要な日に何が起こるでしょうか? 1つの接続を使用し、50kのチャットを処理する必要があります。 – Skizz

    +2

    メッセージごとに開閉接続が送信されますか?その規模はどれくらいうまくいくのだろうか私はいくつかの読書をしてきました。すべての通信が非同期であれば、書込み/読込み終了を介して処理できるデータがあるときにほとんどのソケットがスリープ状態になることがあります。あなたの考えは です。 –

    2

    私はWindows XPの同様のことを探していたとき、私はこれは、Windows 2003の

    +0

    Dinesh Manne:そのリンクをいただきありがとうございます。 –

    2

    を適用すべきだと思う私は私が共有しなければならないと感じているこれにいくつかの答えを発見した(http://smallvoid.com/article/winnt-tcpip-max-limit.html)これを見つけた:

    Windows 2003サーバーでは、使用可能なポート数に制限があります。これは、MaxUSerPortの設定を5000から64k(最大)に変更するためにレジストリを調整することで設定できます。

    さらに詳しく調べると、64kポートの制限は実際にはIPアドレスごとであるため、単一のサーバーで複数のネットワークカードをインストールするか、複数のIPアドレスをバインドすることで、ネットワークカード。そうすれば、n x 64kポートを処理するようにシステムを拡張することができます。

    1

    私のWindow 7マシンで使用可能なソケットに問題があった。 Win 7でソケットリークに関する記事を読んだ後、Windows patchを適用しました。変更はありません。

    1. オープンRegeditをCURRENTCONTROLSET \
      • HKEY_LOCAL_MACHINE \システム:私にとって http://technet.microsoft.com/en-us/magazine/2007.12.network.aspx

        が、それは次のように働いた:

        以下は非常に詳細に窓に接続の問題を説明した記事があります\ services \ Tcpip \ Parameters:TcpNumConnections、REG_DWORD、10進値500を作成します(これは必要に応じて設定できます)。 EnableConnectionRateLimiting、REG_DWORD、値0; Skizz MaxUserPort、REG_DWORD、小数点値65534

    2. Windowsを再起動します
    関連する問題