2010-01-10 6 views
1

Laissez-moi vous expliquer un peu l'application que je suis en train de faire.Options de socket Python UDP pour plusieurs clients et concurrents

Je crée un serveur UDP central (doit être UDP) pour les clients multiples et simultanés qui "parlent" entre eux. Je vérifie une dictée d'adresses de clients connus et crée un thread de gestionnaire de client si "je ne sais pas" le client. Sinon, le thread reçoit l'annonce de données fait son travail. Le nouveau thread reçoit une référence à la socket et l'adresse de l'appelant, ils utilisent donc socket.sendTo avec cette adresse et les données.

Le problème apparaît lorsqu'un client ferme son client (Alt + F4) et que quelqu'un lui parle, car le socket lance une erreur 10054, "Socket connection reset". Pas prévu dans UDP, je pense. La méthode "talk" sur les threads client est également comprise entre try & excepté les balises mais néanmoins, le serveur UDP "recvfrom" celui qui déclenche l'exception.

J'utilise Python 2.5 (besoin pour le code) et cette option socket:

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)) 

Il y a quelques options qui me permettent de faire ce que je voulais ou une bibliothèque qui permet de résoudre ces choses ?.

Ou Si je fais mal ... il y a un moyen de faire/émuler le même comportement que le socket TCP threadé (créer un nouveau thread de gestionnaire de client sur accepter) mais avec UDP?

Merci pour la lecture;)

Répondre

1

La « prise reset » se produit parce que le client a envoyé un ICMP port inaccessible en réponse au datagramme envoyé à une prise qui n'y était pas plus. Une façon parfaitement raisonnable d'exprimer cela dans l'API, alors vous allez devoir le gérer. Mais si vous ignorez simplement l'exception, le socket devrait toujours fonctionner.

Questions connexes