4

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

次に接続を読み書きしようとすると接続が閉じていることに気付きますが、オンデマンドで接続を検出する方法が必要です。

実際の接続に影響を与えることなく、ある種の「Are YouThere」パケットを送信する方法はありますか?telnet RFCは、 「areyouthere」コマンドと「NOP」コマンドをサポートしています。telnetlibにそれらを送信させる方法がわからないだけです。

4

4 に答える 4

4

次の方法でNOPを送信できるはずです。

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

数回実行した後、ログメッセージに「isalive True」と表示されているのに、コードが「if」に入力されておらず、ログメッセージ「telnetsendfailed--dead」が出力されていることに気付きました。最後の実装では、ここで言ったように、メソッドを3回呼び出してい.send()ます(2つでは不十分な場合に備えて)。

それは私の2セントです、それが役立つことを願っています

于 2017-02-08T21:37:35.520 に答える
0

Davidのソリューションのフォローアップとしてclose()、インターフェイスの後で、sock属性がasocket._socketobjectから整数0に変わります。ソケットが閉じ.sendallている場合、への呼び出しは失敗するため、そのタイプを確認することもできます。AttributeError

LinuxおよびWindows7でテスト済み。

于 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 に答える