在python的telnetlib中检测关闭的连接

2024-10-01 17:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python的telnetlib连接到远程telnet服务器。我很难检测连接是否仍然打开,或者远程服务器是否关闭了它。在

我会注意到连接是关闭的,当我试图读或写它,但想有一种方法来检测它的要求。在

有没有办法在不影响实际连接的情况下发送某种“你在吗”数据包?telnet RFC支持“Areyouthere”和“NOP”命令-只是不知道如何让telnetlib发送它们!在


Tags: 方法命令服务器远程rfc情况数据包nop
3条回答

我注意到,由于某些原因,只发送一次是不够的。。。我是偶然“发现”的,我有这样的经历:

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”被打印出来,所以在我的上一个实现中,正如我所说的here,我只调用了.send()方法3次(只是在情况2还不够的情况下)。在

这是我的2分钱,希望能帮上忙

您应该可以通过以下方式发送NOP:

from telnetlib import IAC, NOP

... 

telnet_object.sock.sendall(IAC + NOP)

根据David的解决方案,在接口上的close()之后,sock属性从socket._socketobject变为整数0。如果套接字是关闭的,对.sendall的调用将失败,并返回AttributeError,因此您不妨检查它的类型。在

在Linux和Windows7上进行了测试。在

相关问题 更多 >

    热门问题