Фон
Я не совсем разбираюсь в Python, и большая часть работы, которую я делал ранее, это анализ текстовых файлов.Хотя я понимаю, что Telnet довольно древний, я использую его для учебного примера.
Я использую telnetsrvlib из https://pypi.org/project/telnetsrvlib/, чтобы добавить функциональность в мою программу Python.
Ради того, чтобы все было в одном месте, вот отрывок из многопоточного TelnetHandler:
class TelnetHandler(TelnetHandlerBase):
"A telnet server handler using Threading"
def __init__(self, request, client_address, server):
# This is the cooked input stream (list of charcodes)
self.cookedq = []
# Create the locks for handing the input/output queues
self.IQUEUELOCK = threading.Lock()
self.OQUEUELOCK = threading.Lock()
# Call the base class init method
TelnetHandlerBase.__init__(self, request, client_address, server)
def setup(self):
#Omitted here
def finish(self):
'''Called as the session is ending'''
TelnetHandlerBase.finish(self)
# Might want to ensure the thread_ic is dead
Краткий пример
class MyTelnetHandler(TelnetHandler):
@command(['echo', 'copy', 'repeat'])
def command_echo(self, params):
'''<text to echo>
Echo text back to the console.
'''
self.writeresponse( ' '.join(params) )
class TelnetServer(SocketServer.TCPServer):
allow_reuse_address = True
server = TelnetServer(("0.0.0.0", 8023), MyTelnetHandler)
telnetThread = threading.Thread(target=server.serve_forever, args=(1,))
telnetThread.daemon = True
telnetThread.start()
Сервер запускается, работаети развлекает соединения соответственно.Когда я нажимаю Ctrl-C
, основной процесс завершается, как и telnetThread , если только не происходит активный сеанс Telnet.
Присоединяя gdb, я вижу, что новый поток создается при запуске сеанса Telnet.Если я вручную уничтожу поток сеанса, завершение продолжится, как и должно быть.
(gdb) информационных потоков
10 Thread 0x7fffe57fb700 (LWP 3202) 0x00007ffff7827c2c in __libc_recv (
fd=<value optimized out>, buf=<value optimized out>, n=<value optimized out>,
flags=<value optimized out>) at ../sysdeps/unix/sysv/linux/x86_64/recv.c:34
9 Thread 0x7fffe61fc700 (LWP 3200) 0x00007ffff7827ca3 in recvfrom ()
at ../sysdeps/unix/syscall-template.S:82
3 Thread 0x7fffed2b1700 (LWP 3194) 0x00007ffff6edb6a3 in select ()
at ../sysdeps/unix/syscall-template.S:82
* 1 Thread 0x7ffff7fe5700 (LWP 3190) sem_wait ()
at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
Самый новый поток, # 10, этоСеанс Telnet.
Вопрос
Как заставить сервер закрыть любые активные сеансы?