检测python的telnetlib中的连接关闭

4 投票
4 回答
5213 浏览
提问于 2025-04-17 08:14

我正在使用Python的telnetlib来连接一个远程的telnet服务器。可是我发现很难判断这个连接是否还在,或者说远程服务器是否已经把连接关掉了。

我通常是在下次尝试读取或写入数据时才会发现连接已经关闭,但我希望能有一种方法可以随时检测连接状态。

有没有办法发送一种“你还在吗”的信息包,而不影响实际的连接呢?telnet的标准支持“你还在吗”和“NOP”命令——只是我不太确定怎么用telnetlib来发送这些命令!

4 个回答

0

接着David的解决方案说,当你在接口上调用close()后,sock这个属性会从socket._socketobject变成整数0。如果这个socket已经关闭,调用.sendall就会失败,并出现AttributeError错误,所以你不如直接检查它的类型。

这个是在Linux和Windows 7上测试过的。

1

我发现有些情况下只发送一次是不够的……我偶然间“发现”了这一点,我的代码大概是这样的:

def check_alive(telnet_obj):
    try:
        if telnet_obj.sock: # this way I've taken care of problem if the .close() was called
           telnet_obj.sock.send(IAC+NOP) # notice the use of send instead of sendall
           return True
    except:
           logger.info("telnet send failed - dead")
           pass

# later on
logger.info("is alive %s", check_alive(my_telnet_obj))
if check_alive(my_telnet_obj):
     # do whatever

经过几次运行后,我注意到日志信息显示“is alive True”,但代码并没有进入“if”语句,而且日志信息还打印了“telnet send failed - dead”,所以在我最后的实现中,正如我在这里所说的,我只是调用了.send()方法三次(以防两次不够)。

这就是我的一点看法,希望对你有帮助。

4

你可以通过这种方式发送一个NOP指令:

from telnetlib import IAC, NOP

... 

telnet_object.sock.sendall(IAC + NOP)

撰写回答