4

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

下次我尝试读取或写入连接时,我会注意到连接已关闭,但希望有一种方法可以按需检测它。

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

4

4 回答 4

4

You should be able to send a NOP this way:

from telnetlib import IAC, NOP

... 

telnet_object.sock.sendall(IAC + NOP)
于 2011-12-13T02:36:46.417 回答
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

几次运行后,我注意到日志消息说“是真的”,但代码没有输入“if”,并且打印了日志消息“telnet send failed - dead”,所以在我的最后一个实现,正如我在这里所说的,我只是调用了该.send()方法 3 次(以防万一 2 还不够)。

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

于 2017-02-08T21:37:35.520 回答
0

跟进 David 的解决方案,在close()接口之后,sock属性从 asocket._socketobject变为整数 0。如果套接字已关闭,则调用.sendall失败AttributeError,因此您不妨检查其类型。

通过 Linux 和 Windows 7 测试。

于 2015-10-02T17:08:31.500 回答
0

检测连接是否关闭的最佳方法是通过套接字对象。所以,这样更容易检查,

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

如果关闭返回-1

我从这个问题中获取了这段代码。

于 2020-11-11T11:47:32.727 回答