2012-07-09 5 views
5

Ich habe einen Server geschrieben mit Python und der Twisted-Bibliothek, die über UDP kommuniziert. Das alles funktioniert gut.Wie höre ich mehrere UDP-Ports mit Twisted?

Was ich tun möchte, ist diesen Server zu erweitern, so dass es Nachrichten auf mehreren UDP-Ports gleichzeitig akzeptieren kann (Ich verwende die verschiedenen Ports, um die zurückgegebenen Informationen zu trennen, und es geht weniger um die Quelle der Anfrage). Ich habe versucht, das einfachste, was zunächst als Test zu tun - ich Code geschrieben, der wie folgt aussieht:

reactor.listenUDP(port, handler) 
reactor.listenUDP(port+1, handler) 

(Die erste Zeile ist die ursprünglich in meinem Server, die zweite Zeile ist der zweite Anschluss zu hören to)

Wenn ich laufe, dass ich folgend:.

File "./rspServer.py", line 838, in mainLoop 
    reactor.listenUDP(self.args.port+1, udpHandler) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/posixbase.py", line 347, in listenUDP 
    p.startListening() 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/udp.py", line 86, in startListening 
    self._connectToProtocol() 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/udp.py", line 106, in _connectToProtocol 
    self.protocol.makeConnection(self) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/protocol.py", line 665, in makeConnection 
    assert self.transport == None 
AssertionError 

ich daraus nehmen, dass ich nicht einen zweiten UDP-Listener hinzufügen kann, aber das ist genau das, was ich tun möchte (eigentlich, um insgesamt 18 Zuhörer zu machen - es ist eine lange Geschichte). Irgendwelche Gedanken darüber, wie man das macht?

+0

Sie könnten mehrere Handler-Instanzen statt derselben übergeben – jfs

+1

Rakis hat eine richtige Antwort auf Ihre Frage hinterlassen, aber das ist auch ein Fehler in Twisted - auch wenn es ein Fehler ist, sollten Sie nie eine solche nicht hilfreiche Fehlermeldung erhalten (und Sie sollten nie einen Assertionsfehler sehen, Punkt). Bitte melden Sie einen Fehler unter http://twistedmatrix.com/ – Glyph

Antwort

7

Jeder Aufruf von listenUDP() benötigt eine eindeutige Handlerinstanz. Ansonsten sieht dein Code gut aus.

+1

Das ist genau das. Danke für die Hilfe. Ich kann jetzt meine 18 Häfen aktiv hören lassen. –