Detect a closed connection in python's telnetlib

时间秒杀一切 提交于 2020-01-02 06:37:06

问题


I'm using python's telnetlib to connect to a remote telnet server. I'm having a hard time detecting if the connection is still open, or if the remote server closed it on me.

I will notice the connection is closed the next time I try to read or write to it, but would like to have a way to detect it on demand.

Is there a way to send some sort of an 'Are You There' packet without affecting the actual connection? The telnet RFC supports an "are you there" and "NOP" commands - just not sure how to get telnetlib to send them!


回答1:


You should be able to send a NOP this way:

from telnetlib import IAC, NOP

... 

telnet_object.sock.sendall(IAC + NOP)



回答2:


I've noticed that for some reason sending only once was not enough ... I've "discovered it" by accident, I had something like this:

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

after a few runs I've noticed that the log message was saying "is alive True", but the code didn't entered the "if", and that the log message "telnet send failed - dead" was printed, so in my last implementation, as I was saying here, I'm just calling the .send() method 3 times (just in case 2 were not enough).

That's my 2 cents, hope it helps




回答3:


Following up on David's solution, after close() on the interface, the sock attribute changes from being a socket._socketobject to being the integer 0. The call to .sendall fails with an AttributeError if the socket is closed, so you may as well just check its type.

Tested with Linux and Windows 7.



来源:https://stackoverflow.com/questions/8480766/detect-a-closed-connection-in-pythons-telnetlib

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!