2010-12-06 3 views
1

Je suis en train d'écrire un serveur multithread en python en utilisant twisted. callInThread (self.task) est de créer un nouveau thread pour exécuter task() chaque fois qu'un client demande sth à partir du serveur. Lorsque le client envoie des requêtes un par un (tous à travers le port 53), tout fonctionne, mais quand il y a plusieurs demandes en même temps, il ditadresse déjà utilisée avec le serveur multithread dans tordu

File "", line 1, in bind socket.error: [Errno 98] Address already in use

Y at-il STH mal avec mes fils, que l'on peut utiliser le port à la fois? Si oui, comment suis-je censé aller avec multithreading mon serveur? Merci beaucoup!

class BaseThreadedUDPServer(DatagramProtocol): 
    def datagramReceived(self, datagram, (host, port)): 
     print "received %r from %s:%d" % (datagram, host, port) 
     reactor.callInThread(self.task) 

    def task(a): 
     print "waiting on port:", csport 
     while 1: 
      ## RCV QUERY ## 
      query, addr = csSocket.recvfrom(csbuf) 
      ## GET ANS ## 
      ans = socket.gethostbyname(query) 
      ## SEND ANS ## 
      scSocket.sendto(ans, scaddr) 

def main(): 
    print "main" 
    reactor.listenUDP(53, BaseThreadedUDPServer()) 
    reactor.run() 
+0

@pilu: On dirait que vous ne vous tordez pas du tout ... vous n'avez pas besoin de fils pour faire des choses en parallèle, en fait vous devriez les éviter complètement. –

+0

que voulez-vous dire? N'avez-vous pas besoin d'avoir des threads pour faire fonctionner les choses en parrallel? – umm

+0

Est-ce que "sth" signifie "quelque chose?" –

Répondre

2

Vous n'avez pas besoin de threads. C'est horriblement buggy. Twisted appelle déjà recv pour vous: et c'est le résultat de ce qui est passé à datagramReceived. Ne l'appelle plus toi-même. Vous n'avez pas besoin d'un fil.

Cependant, cela n'a probablement rien à voir avec votre problème. 53 est le port DNS par défaut: le problème que vous avez est qu'un autre serveur, probablement un serveur DNS est déjà en cours d'exécution sur cet ordinateur. Essayez de changer 53 pour une autre valeur.

Mais je ne suis pas vraiment sûr; à l'avenir, veuillez coller un retraçage complet. Cette ligne de retraçage ne provient évidemment pas de l'exemple que vous avez collé, puisqu'il n'y a rien sur la ligne 1 sauf une instruction 'class'. En outre, puisque ce code est indenté et génère un SyntaxError, il n'est évidemment pas exactement le même que celui que vous utilisez.

En supposant que vous êtes en train de faire quelque chose avec DNS, Twisted a son propre serveur DNS; vous devriez utiliser twisted.names plutôt que d'implémenter votre propre analyse de paquets DNS.

Questions connexes