From 76b4cb0766af6d12cca55631d06246a8fca71bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=20=D0=91=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD?= Date: Thu, 4 Apr 2019 23:24:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20=D0=B7?= =?UTF-8?q?=D0=B0=D1=89=D0=B8=D1=89=D1=91=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/stream.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/mods/stream.py b/mods/stream.py index 052af0e..aec211a 100644 --- a/mods/stream.py +++ b/mods/stream.py @@ -8,6 +8,8 @@ import time peers = {} +PORT = 16386 + RETRANSMIT_RETRIES = 3 DATAGRAM_MAX_SIZE = 9000 RAW_DATA_MAX_SIZE = 8000 @@ -238,5 +240,56 @@ class UDPRequestHandler(socketserver.DatagramRequestHandler): except EOFError: del peers[peer_addr] +class ThreadingUDPServer(socketserver.ThreadingMixIn, socketserver.UDPServer): + pass + +udpserver = ThreadingUDPServer(('0.0.0.0', PORT), UDPRequestHandler) +udpserver_thread = threading.Thread(target=udpserver.serve_forever) +udpserver_thread.start() + class EncryptedUDPStream: - + MAX_IO_CHUNK = 8000 + def __init__(self, sock, peer_addr): + self.peer_addr = peer_addr + self.sock = sock + @classmethod + def _connect(cls, host, port): + peers[(host, port)] = Peer(udpserver.socket, (host, port)) + peers[(host, port)].hello() + return udpserver.socket + @classmethod + def connect(cls, host, port, **kwargs): + return cls(cls._connect(host, port), (host, port)) + def poll(self, timeout): + timeout = Timeout(timeout) + while timeout.timeleft(): + try: + rl = peers[self.peer_addr].poll() + if rl: break + except: + raise EOFError + return rl + def close(self): + if self.peer_addr in peers: del peers[self.peer_addr] + @property + def closed(self): + return self.peer_addr not in peers + def fileno(self): + try: + return self.sock.fileno() + except: + self.close() + raise EOFError + def read(self, count): + try: + buf = peers[self.peer_addr].get_next_block() + except: + raise EOFError + return buf + def write(self, data): + try: + peers[self.peer_addr].send_packet(data) + except: + raise EOFError + +