我正在使用python的telnetlib连接到远程telnet服务器。我很难检测到连接是否仍处于打开状态,或者远程服务器是否关闭了它。
我会注意到下次尝试读取或写入时连接已关闭,但希望能够按需检测连接。
有没有办法在不影响实际连接的情况下发送某种“Are You There”数据包? telnet RFC支持“你在那里”和“NOP”命令 - 只是不确定如何让telnetlib发送它们!
答案 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处获得了这段代码。