DbgMuxConnHandler: implement DbgMuxConnUdpBridge
This commit is contained in:
parent
af18b58e1f
commit
c58e7e3f07
41
handlers.py
41
handlers.py
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
import logging as log
|
import logging as log
|
||||||
import threading
|
import threading
|
||||||
|
import socket
|
||||||
import queue
|
import queue
|
||||||
import enum
|
import enum
|
||||||
import abc
|
import abc
|
||||||
|
@ -120,3 +121,43 @@ class DbgMuxConnHandler(DbgMuxFrameHandler):
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def _handle_terminate(self) -> None:
|
def _handle_terminate(self) -> None:
|
||||||
''' Called on connection termination '''
|
''' Called on connection termination '''
|
||||||
|
|
||||||
|
|
||||||
|
class DbgMuxConnUdpBridge(DbgMuxConnHandler):
|
||||||
|
DGRAM_MAX_LEN: int = 1024
|
||||||
|
|
||||||
|
def __init__(self, *args, **kw):
|
||||||
|
super().__init__(*args)
|
||||||
|
|
||||||
|
self.raddr: str = kw.get('raddr', '127.0.0.1')
|
||||||
|
self.rport: int = kw.get('rport', 9999)
|
||||||
|
self.laddr: str = kw.get('laddr', '127.0.0.1')
|
||||||
|
self.lport: int = kw.get('lport', 8888)
|
||||||
|
|
||||||
|
self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
|
self._sock.bind((self.laddr, self.lport))
|
||||||
|
self._sock.settimeout(0.5)
|
||||||
|
|
||||||
|
self._thread = threading.Thread(target=self._worker,
|
||||||
|
daemon=True)
|
||||||
|
self._shutdown = threading.Event()
|
||||||
|
|
||||||
|
def _worker(self) -> None:
|
||||||
|
while not self._shutdown.is_set():
|
||||||
|
try:
|
||||||
|
(data, addr) = self._sock.recvfrom(self.DGRAM_MAX_LEN)
|
||||||
|
if self.conn_state == ConnState.Established:
|
||||||
|
self.send_data(data)
|
||||||
|
except TimeoutError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _handle_data(self, data: bytes) -> None:
|
||||||
|
self._sock.sendto(data, (self.raddr, self.rport))
|
||||||
|
|
||||||
|
def _handle_establish(self) -> None:
|
||||||
|
self._shutdown.clear()
|
||||||
|
self._thread.start()
|
||||||
|
|
||||||
|
def _handle_terminate(self) -> None:
|
||||||
|
self._shutdown.set()
|
||||||
|
|
Loading…
Reference in New Issue