python udp twisted asyncore

Servidor UDP asyncore de Python



twisted (1)

Estoy escribiendo una aplicación de servidor en Python que escucha las solicitudes, las procesa y envía una respuesta.

Todas las solicitudes / respuestas se envían desde la misma dirección y puerto a la aplicación del servidor. Necesito recv / enviar mensajes simultáneamente, y el servidor necesita recibir / enviar mensajes desde / hacia el mismo puerto y dirección. Encontré algunos tutoriales para sockets asíngóricos, pero solo hay ejemplos de conexiones TCP.

Lamentablemente, necesito UDP. Cuando cambio SOCK_STREAM a SOCK_DGRAM en el método create, SOCK_DGRAM un error.

return getattr(self._sock,name)(*args) socket.error: [Errno 95] Operation not supported

Traté de usar twisted, pero no sé cómo escribir la parte del remitente, que puede vincularse al mismo puerto que escucha. El último resultado fue el puerto bloqueado.

¿Hay alguna forma de cómo usar sockets asyncore con UDP o cómo usar twisted para enviar desde el mismo puerto? Algunos ejemplos serán muy apreciados.


Puedes simplemente escribir la parte de envío y recepción de tu código y trabajarán juntos. Tenga en cuenta que puede enviar y recibir en un solo socket UDP de escucha: no necesita uno para cada uno (especialmente si desea enviar y recibir desde la misma dirección).

from __future__ import print_function from sys import stdout from twisted.python.log import startLogging from twisted.internet import reactor from twisted.internet.protocol import DatagramProtocol class SomeUDP(DatagramProtocol): def datagramReceived(self, datagram, address): print(u"Got a datagram of {} bytes.".format(len(datagram))) def sendFoo(self, foo, ip, port): self.transport.write( (u"Foo datagram: {}".format(foo)).encode("utf-8"), (ip, port)) class SomeSender(object): def __init__(self, proto): self.proto = proto def start(self): reactor.callLater(3, self._send) def _send(self): self.proto.sendFoo(u"Hello or whatever", b"127.0.0.1", 12345) self.start() startLogging(stdout) proto = SomeUDP() reactor.listenUDP(12345, proto) SomeSender(proto).start() reactor.run()