from servicethread import PermanentServiceThread import socket class ListeningThread(PermanentServiceThread): def __init__(self, host, port, threadclass, **kwargs): super().__init__() self.hostname = host self.port = port self.threadclass = threadclass self.kwargs = kwargs def execute(self): self.tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) # self.tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_ATTACH_REUSEPORT_CBPF, 1) self.tcpsock.bind((self.hostname, self.port)) self.tcpsock.listen(5) print('[port][%s] Listening' % self.port) while self.is_running(): try: (clientsocket, (ip, port)) = self.tcpsock.accept() print('[port][{}] Accepted: {} <=> {}'.format( self.port, clientsocket.getsockname(), clientsocket.getpeername(), )) newthread = self.threadclass(ip, port, clientsocket, **self.kwargs) newthread.start() except socket.timeout: pass def stop(self): super().stop() clientsocker = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clientsocker.connect( (self.hostname, self.port) ) self.tcpsock.close() print('[port][%s] Stop listening' % self.port)