2011-12-12 15 views
3

私はPythonのtelnetlibを使ってリモートtelnetサーバに接続しています。私は、接続がまだ開いているかどうか、またはリモートサーバがそれを閉じたかどうかを検出するのに苦労しています。pythonのtelnetlibで閉じた接続を検出する

次回読み書きしようとすると接続が切断されますが、要求に応じて検出する方法が必要です。

実際の接続に影響を与えずに「Are You There」パケットを送信する方法はありますか? telnet RFCは「そこにいる?」と「NOP」コマンドをサポートしています。telnetlibにそれらを送信する方法はわかりません!

答えて

3

あなたはNOPをこの方法で送ることができる必要があります:

from telnetlib import IAC, NOP 

... 

telnet_object.sock.sendall(IAC + NOP) 
+0

接続を検出するために何をする必要がありますか?私は "socket_ = tn.get_socket()"でソケットをつかんで "NOP"を送りましたが、例外は発生しませんでした。 – skid

0

は、インターフェイス上close()後、Davidのソリューションにフォローアップ、socket._socketobjectされてからの呼び出し0の整数であることにsock属性の変更〜.sendallにはソケットが閉じている場合はAttributeErrorで失敗するため、そのタイプを確認するだけでも問題ありません。 LinuxとWindows 7

+0

このチェックは、あなたの側でテルネット接続が閉じられている場合にのみ使用できます。接続がリモートで閉じられた場合、オブジェクトのタイプは "socket._socketobject"であり、整数ではありません。 – skid

0

でテスト

私は一度だけ送信何らかの理由で十分な...私は偶然、「それを発見し、」きていなかったことを、私はこのような何かを持っていた気づいた:

死んだ - 私は、ログメッセージが「真の生きている」と言ってましたが、コードは「場合」を入力すると、ログメッセージ」のtelnet送信が失敗したことがなかったことに気付きましたいくつかの実行後
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 

"最後の実装では、hereと言っていたので、私は.send()を呼び出しましたhod 3回(ケース2で十分ではない)。

これは私の2セントです。役に立ったら嬉しいです。

関連する問題