2012-07-09 15 views
5

He escrito un servidor usando Python y la biblioteca Twisted que se comunica a través de UDP. Todo esto funciona bien¿Cómo escucho múltiples puertos udp usando twisted?

Lo que me gustaría hacer es extender ese servidor para que pueda aceptar mensajes en múltiples puertos UDP simultáneamente (utilizo los diferentes puertos para segregar la información devuelta, y se trata menos del origen de la solicitud). He tratado de hacer lo más simple por primera vez como una prueba - he escrito código que se parece a esto:

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

(La primera línea es la que originalmente en mi servidor; la segunda línea es el segundo puerto para escuchar a)

Cuando corro de eso, me sale el siguiente:.

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 

tomo de esto que no puedo añadir una segunda escucha UDP, pero eso es exactamente lo que me gustaría hacer (en realidad, para hacer un total de 18 oyentes, es una larga historia). ¿Alguna idea de cómo hacer esto?

+0

podría pasar varias instancias de controlador en lugar de la misma – jfs

+1

Rakis ha dejado una respuesta correcta a su pregunta, pero esto también es un error en Twisted - incluso si es un error, nunca debería recibir un mensaje de error tan inútil (y nunca deberías ver un error de aserción, punto). Por favor, presente un error en http://twistedmatrix.com/ – Glyph

Respuesta

7

Cada llamada a listenUDP() necesita una instancia única de controlador. Aparte de eso, tu código se ve bien.

+1

Eso es exactamente. Gracias por la ayuda. Ahora puedo escuchar activamente mis 18 puertos. –

Cuestiones relacionadas