2012-07-09 17 views
5

Ho scritto un server utilizzando Python e la libreria Twisted che comunica tramite UDP. Tutto funziona bene.Come si ascoltano più porte udp usando twistato?

Quello che vorrei fare è estendere tale server in modo che possa accettare i messaggi su più porte UDP contemporaneamente (io uso le diverse porte per separare le informazioni restituite, ed è meno la fonte della richiesta). Ho cercato di fare la cosa più semplice in primo luogo come un test - ho scritto il codice che assomiglia a questo:

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

(La prima riga è quella originariamente nel mio server, la seconda linea è il secondo porto per ascoltare a)

Quando eseguo che, ricevo il seguente:.

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 

prendo da questo che non posso aggiungere un secondo ascoltatore UDP, ma questo è esattamente quello che mi piacerebbe fare (in realtà, per fare un totale di 18 ascoltatori - è una lunga storia). Qualche idea su come fare questo?

+0

potresti passare più istanze di handler invece dello stesso – jfs

+1

Rakis ha lasciato una risposta corretta alla tua domanda, ma questo è anche un bug in Twisted - anche se si tratta di un errore, non dovresti mai ricevere un messaggio di errore inutile (e non dovresti mai vedere un errore di asserzione, punto). Si prega di presentare un bug all'indirizzo http://twistedmatrix.com/ – Glyph

risposta

7

Ogni chiamata a listenUDP() richiede un'istanza di gestore univoca. Oltre a questo, il tuo codice sembra a posto.

+1

Questo è esattamente. Grazie per l'aiuto. Ora sono in grado di ascoltare attivamente le mie 18 porte. –