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

时间:2011-12-12 20:59:29

标签: python telnetlib

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

我会注意到下次尝试读取或写入时连接已关闭,但希望能够按需检测连接。

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

4 个答案:

答案 0 :(得分:3)

你应该能够以这种方式发送NOP:

from telnetlib import IAC, NOP

... 

telnet_object.sock.sendall(IAC + NOP)

答案 1 :(得分:0)

跟进David的解决方案,在接口close()之后,sock属性从socket._socketobject变为整数0.对{{{如果套接字关闭,则1}}失败并显示.sendall,因此您也可以检查其类型。

使用Linux和Windows 7进行测试。

答案 2 :(得分:0)

我注意到由于某种原因只发送一次是不够的......我已经发现了它"不小心,我有这样的事情:

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
经过几次运行后,我注意到日志消息说"还活着#34;但是代码没有进入"如果",并且日志消息" telnet发送失败 - 死了"是打印出来的,所以在我的上一次实现中,正如我所说的那样here,我只是调用了.send()方法3次(仅仅是在案例2中还不够)。

这是我的2美分,希望有所帮助

答案 3 :(得分:0)

检测连接是否关闭的最佳方法是通过套接字对象。因此,以这种方式进行检查更容易,

def is_connected(telnet_obj):
    return telnet_obj.get_socket().fileno()

如果关闭,则返回-1

我从question处获得了这段代码。