我正在使用 python 的telnetlib连接到远程 telnet 服务器。我很难检测连接是否仍然打开,或者远程服务器是否在我身上关闭了它。
下次我尝试读取或写入连接时,我会注意到连接已关闭,但希望有一种方法可以按需检测它。
有没有办法在不影响实际连接的情况下发送某种“Are You There”数据包?telnet RFC支持“你在吗”和“NOP”命令——只是不确定如何让 telnetlib 发送它们!
我正在使用 python 的telnetlib连接到远程 telnet 服务器。我很难检测连接是否仍然打开,或者远程服务器是否在我身上关闭了它。
下次我尝试读取或写入连接时,我会注意到连接已关闭,但希望有一种方法可以按需检测它。
有没有办法在不影响实际连接的情况下发送某种“Are You There”数据包?telnet RFC支持“你在吗”和“NOP”命令——只是不确定如何让 telnetlib 发送它们!
You should be able to send a NOP this way:
from telnetlib import IAC, NOP
...
telnet_object.sock.sendall(IAC + NOP)
我注意到由于某种原因只发送一次是不够的......我偶然“发现”了它,我有这样的事情:
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
几次运行后,我注意到日志消息说“是真的”,但代码没有输入“if”,并且打印了日志消息“telnet send failed - dead”,所以在我的最后一个实现,正如我在这里所说的,我只是调用了该.send()
方法 3 次(以防万一 2 还不够)。
这是我的 2 美分,希望对您有所帮助
跟进 David 的解决方案,在close()
接口之后,sock
属性从 asocket._socketobject
变为整数 0。如果套接字已关闭,则调用.sendall
失败AttributeError
,因此您不妨检查其类型。
通过 Linux 和 Windows 7 测试。
检测连接是否关闭的最佳方法是通过套接字对象。所以,这样更容易检查,
def is_connected(telnet_obj):
return telnet_obj.get_socket().fileno()
如果关闭返回-1
我从这个问题中获取了这段代码。