1

私がやっているアプリについて少し説明させてください。

私は、それらの間でも「話す」複数の同時クライアント用の中央UDP(UDPである必要がある)サーバーを作成しています。既知のクライアント アドレスの dict をチェックし、クライアントが「わからない」場合はクライアント ハンドラ スレッドを作成します。それ以外の場合、スレッドはデータを受け取り、そのジョブを実行します。新しいスレッドはソケットへの参照と呼び出し元アドレスを受け取るため、そのアドレスとデータで 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を使用しますか?

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

4

1 に答える 1

1

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

于 2010-01-10T00:46:39.053 に答える