2017-01-11 6 views
3

私は、ソケットプログラミングを使ってPythonで簡単なチャットアプリケーションを作成しています。この "socket.listen(100)"(これは100に制限されています)とは異なり、無制限の接続を受け入れるにはソケットが必要です。私は大量の接続を処理するために何をすべきですか?ソケットで無制限の接続を受け入れる

+0

を参照してください。あなたが無制限の接続のための無制限の帯域幅を持っていますか? –

+0

はい、私は無制限の帯域幅を持つVPSを持っています。 – Matarata

+1

'' socket.listen''のパラメータは、 '' accept''されていない保留中の接続の最大数です。確立された接続の数は制限されません。 – jasonharper

答えて

3

listen()で与えられた数は、バックログキューの大きさ - 保留中の要求の数ではなく、アクティブな要求の数にヒント

バックログパラメータには、通常、5の値が使用されます。これは過去のものです。 Berkeleyソケットの初期のバージョンでは、5より大きい値が5を与えた "機能"がありました。これはずっと前に修正されましたが、あなたが心配する必要のある番号ではありません。ヒントだけであることを覚えておいてください。

バックログが超過した場合、クライアントに実際に渡されるエラーは一般的にcatch-all ECONNREFUSEDですが、古いシステムでは特定のバックログエラーが発生します。

多くのシステムでは、バックログはサイレントでSOMAXCONNに切り捨てられます。

listen() ignores the backlog argument?

1

新しい接続をaccept()するだけで、それぞれを処理する新しいスレッドを開始するaccept()ループが必要です。誰かが接続しようとすると、すぐにそれを受け入れて接続リストに追加します。

セッションのアイドルタイムアウトを長くしたい場合は、長いタイムアウトで読み込む接続ごとのスレッド。タイムアウトが切れると、ソケットを閉じてスレッドを終了します。

同時接続が十分にある場合にサーバーがFDを使い果たした場合、accept()は対応するerrnoで失敗し始めます。この場合、無視してループを続けるだけです。おそらく、この状況でアイドルタイムアウトを減らし、受け入れが再び働くようになったらそれを戻すかもしれません。

問題が多少間違っています。サーバー側のソケットでは、同じソケットへの接続を受け入れ、他のプロセス/スレッドによって処理されます。

# 
# Setup socket and other handling stuff here 
# 

while True: 
    conn = sock.accept() 
    thread.start_new_thread(handler, (conn,)) 

実際のシステムのメモリに基づく最大ソケット数には実際的な制限があります。

http://docs.python.org/2/library/socketserver.htmlを参照してください。私は最後のいくつかの例(Asynchronous Mixinsの下で)は、あなたが達成したいものに非常に近いと思う。

関連する問題