1 votes

Options de socket UDP Python pour plusieurs clients simultanés

Permettez-moi d'expliquer un peu l'application que je suis en train de créer.

Je crée un serveur UDP central (doit être UDP) pour plusieurs clients simultanés qui "communiquent" également entre eux. Je vérifie un dictionnaire des adresses clients connues et crée un thread de gestion de client si je ne connais pas le client. Sinon, le thread reçoit les données et fait son travail. Le nouveau thread reçoit une référence du socket et l'adresse de l'appelant, ainsi ils utilisent socket.sendTo avec cette adresse et les données.

Le problème survient lorsqu'un client ferme son client (Alt+F4) et que quelqu'un lui parle, car le socket lance une erreur 10054, "Réinitialisation de la connexion du socket". Pas attendu en UDP, je pense. La méthode de "communication" sur les threads client est également entre balises try & except mais néanmoins, c'est le serveur UDP "recvfrom" qui déclenche l'exception.

Je suis en train d'utiliser Python 2.5 (j'en ai besoin pour le code) et ces options de socket :

hôte = "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((hôte,port))

Y a-t-il des options qui me permettent de faire ce que je veux ou une bibliothèque qui résout ces problèmes ?.

Ou si je me trompe... existe-t-il un moyen de faire/imiter le même comportement qu'un socket TCP threadé (créer un nouveau thread de gestion client sur accept) mais avec UDP ?

Merci de m'avoir lu ;)

1voto

Andrew McGregor Points 7641

Le 'réinitialisation du socket' se produit parce que le client a envoyé un message ICMP de port injoignable en réponse au datagramme envoyé à un socket qui n'existait plus. C'est une façon parfaitement raisonnable de l'exprimer dans l'API, donc vous devrez simplement le gérer. Mais si vous ignorez simplement l'exception, le socket devrait continuer à fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X