强制子Telnet进程终止并强制关闭连接

时间:2019-01-30 20:41:53

标签: multithreading python-2.7 telnet terminate telnetlib

背景

我并不是完全精通Python,我之前所做的大部分工作都是解析文本文件。虽然我意识到Telnet相当古老,但我将其用作教学示例。

我正在使用https://pypi.org/project/telnetsrvlib/中的telnetsrvlib向我的Python程序添加功能。

为了将所有内容都放在一个地方,以下是Threaded 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会话。

问题

如何强制服务器关闭任何活动会话?

0 个答案:

没有答案
相关问题