1


0

複数および同時クライアント用のPython UDPソケットオプション

私がやっているアプリについて少し説明しましょう。

私はまた、それらの間で「会話」する複数の同時クライアントのための中央UDP(UDPである必要があります)サーバーを作成しています。 既知のクライアントアドレスの辞書をチェックし、クライアントを「知らない」場合はクライアントハンドラスレッドを作成します。 そうでない場合、スレッドはデータ広告を受け取り、その仕事をします。 新しいスレッドはソケットと呼び出し元アドレスへの参照を受け取るため、そのアドレスとデータでsocket.sendToを使用します。

この問題は、クライアントがクライアント(Alt + F4)を閉じて誰かがemと話すときに発生し、ソケットが10054エラー「ソケット接続のリセット」をスローします。 UDPでは期待されていません。 クライアントスレッドの「talk」メソッドもtry&exceptタグの間にありますが、それでもUDPサーバーは例外をトリガーする「recvfrom」です。

Python 2.5(コードに必要)とこのソケットオプションを使用しています。

host = "0.0.0.0"
port = 10000

UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
UDPSock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
UDPSock.bind((host,port))

私が望んでいたことをできるようにするいくつかのオプション、またはこのことを解決するライブラリがありますか?

または私が間違っている場合…​ スレッド化されたTCPソケットと同じ動作を行う/エミュレートする方法があります(受け入れ時に新しいクライアントハンドラスレッドを作成します)が、UDPを使用しますか?

読んでくれてありがとう ;)

1 Answer


1


「ソケットリセット」が発生するのは、クライアントが、存在しないソケットに送信されたデータグラムに応答してICMPポート到達不能を送信したためです。 APIでそれを表現する完全に合理的な方法なので、あなたはそれを処理する必要があります。 ただし、例外を無視するだけであれば、ソケットはまだ機能しているはずです。