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()