43726


皆さん、ご回答ありがとうございます。  
しばらく別タスクで離れていたので、いただいた回答の方を対応できていないので、まだ解決済みと出来ていませんが、確認次第対応したいと思います。

別件の問題が発生しており、pythonのsocketのタイムアウトについて、以下の問題がありました。

・socket.gethostbyaddr: 指定したタイムアウト時間(0.5秒）でタイムアウト処理がされない  
・s.gethostbyaddr: そもそも実行が失敗する

[code]

    def socket_test(self, ip):
        socket.setdefaulttimeout(0.5)
        s = socket.socket()
        print(socket.getdefaulttimeout())  #0.5
        print(s.gettimeout())  #0.5
        s.settimeout(0.3)  # 不要だが念のため
        print(s.gettimeout())  #0.3
    
        # 実行
        print(socket.gethostbyaddr(ip))
        # print(s.gethostbyaddr(ip))  #こちらはAttributeError: 'socket' object has no attribute 'gethostbyaddr'
    
[/code]

デバッグのためにprintをいれており、タイムアウト値が設定されている事が分かっています。  
実行の後者がエラーになるのは分かりますが、前者でタイムアウト値が適用されていないのはよく分かりません。

後者のs.のgethostbyaddrが実行できるのが理想ですが、socket.gethostbyaddrでタイムアウトが正しく適用できる状態であればそれでも良いのですが、どのようにすれば実現できますでしょうか？

テストに使用したIPは  
・すぐにホスト名が取得できる任意のIP  
・すぐにnot foundが取得できる任意のIP  
・Linuxのhostコマンドを実行しても10秒以上掛かってtime outになる任意のIP

の３パターンです。


CC BY-SA 4.0
2018-05-02T06:07:06.087
43722
2018-05-02T07:32:45.807
27817
question
python socket
socketのtimeoutが反映されていない


socketオブジェクトのタイムアウトは、接続時、読み書き時に適用されるもので、`gethostbyaddr`のような「名前解決」時には適用されないと思います。

`gethostbyaddr`のタイムアウトはDNSルックアップのタイムアウトに依存しているからですが、これをpythonアプリケーションから制御するのは無理かと思います。

＃本家StackOverflowで近しい質問と回答があります。(この質問は直接`gethostbyaddr`に対し質問しているわけではないですが、名前解決の問題、ということで類似と判断しました)  
(この質問の回答では、スレッド起こして独自にタイムアウト監視するか、`/etc/resolv.conf`をチューニングすれば可能、と回答しているようです)

> [Pass timeout to
> socket.getaddrinfo](https://stackoverflow.com/questions/26857922/pass-
> timeout-to-socket-getaddrinfo)

なお、`gethostbyaddr`は関数なので、socketオブジェクトから呼び出せないのは仕様通りかと思います。


CC BY-SA 4.0
2018-05-02T07:32:45.807
43726
2018-05-02T07:32:45.807
20098
43722
answer