added RPyC over EUDP
parent
6f58cd1ae7
commit
ed5139c726
|
@ -0,0 +1,65 @@
|
|||
import rpyc
|
||||
from rpyc.utils.server import ThreadedServer
|
||||
from rpyc.core import SocketStream, Channel
|
||||
from rpyc.utils.factory import connect_stream
|
||||
from rpyc.lib import Timeout
|
||||
import eudp
|
||||
import sys
|
||||
|
||||
class EUDPSocketStream(SocketStream):
|
||||
MAX_IO_CHUNK = eudp.DATA_LENGTH
|
||||
@classmethod
|
||||
def eudp_connect(cls, host, port, *a, **kw):
|
||||
sock = eudp.EUDP(encrypted=True)
|
||||
sock.connect((host, port))
|
||||
return cls(sock)
|
||||
def poll(self, timeout):
|
||||
timeout = Timeout(timeout)
|
||||
return self.sock.poll(timeout.timeleft())
|
||||
|
||||
def read(self, count):
|
||||
try:
|
||||
return self.sock.recv(count)
|
||||
except EOFError:
|
||||
self.close()
|
||||
raise EOFError
|
||||
def write(self, data):
|
||||
try:
|
||||
self.sock.send(data)
|
||||
except EOFError:
|
||||
ex = sys.exc_info()[1]
|
||||
self.close()
|
||||
raise EOFError(ex)
|
||||
def eudp_connect(host, port, service=rpyc.VoidService, config={}, **kw):
|
||||
s = EUDPSocketStream.eudp_connect(host, port, **kw)
|
||||
return connect_stream(s, service, config)
|
||||
class EUDPThreadedServer(ThreadedServer):
|
||||
def __init__(self, service, hostname = '', ipv6 = False, port = 0,
|
||||
backlog = 1, reuse_addr = True, authenticator = None, registrar = None,
|
||||
auto_register = None, protocol_config = {}, logger = None, listener_timeout = 0.5,
|
||||
socket_path = None):
|
||||
ThreadedServer.__init__(self, service, hostname=hostname, ipv6=ipv6, port=port,
|
||||
backlog=backlog, reuse_addr=reuse_addr, authenticator=authenticator, registrar=registrar,
|
||||
auto_register=auto_register, protocol_config=protocol_config, logger=logger, listener_timeout=listener_timeout,
|
||||
socket_path=socket_path)
|
||||
self.listener.close()
|
||||
self.listener = None
|
||||
##########
|
||||
self.listener = eudp.EUDP(encrypted=True)
|
||||
self.listener.bind((hostname, port))
|
||||
sockname = self.listener.getsockname()
|
||||
self.host, self.port = sockname[0], sockname[1]
|
||||
def _serve_client(self, sock, credentials):
|
||||
addrinfo = sock.getpeername()
|
||||
if credentials:
|
||||
self.logger.info("welcome %s (%r)", addrinfo, credentials)
|
||||
else:
|
||||
self.logger.info("welcome %s", addrinfo)
|
||||
try:
|
||||
config = dict(self.protocol_config, credentials = credentials,
|
||||
endpoints = (sock.getsockname(), addrinfo), logger = self.logger)
|
||||
conn = self.service._connect(Channel(EUDPSocketStream(sock)), config)
|
||||
self._handle_connection(conn)
|
||||
finally:
|
||||
self.logger.info("goodbye %s", addrinfo)
|
||||
|
Loading…
Reference in New Issue