检测python的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)