質問: 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' ``` デバッグのためにprintをいれており、タイムアウト値が設定されている事が分かっています。 実行の後者がエラーになるのは分かりますが、前者でタイムアウト値が適用されていないのはよく分かりません。 後者のs.のgethostbyaddrが実行できるのが理想ですが、socket.gethostbyaddrでタイムアウトが正しく適用できる状態であればそれでも良いのですが、どのようにすれば実現できますでしょうか? テストに使用したIPは ・すぐにホスト名が取得できる任意のIP ・すぐにnot foundが取得できる任意のIP ・Linuxのhostコマンドを実行しても10秒以上掛かってtime outになる任意のIP の3パターンです。
回答: socketオブジェクトのタイムアウトは、接続時、読み書き時に適用されるもので、`gethostbyaddr`のような「名前解決」時には適用されないと思います。 `gethostbyaddr`のタイムアウトはDNSルックアップのタイムアウトに依存しているからですが、これをpythonアプリケーションから制御するのは無理かと思います。 #本家StackOverflowで近しい質問と回答があります。(この質問は直接`gethostbyaddr`に対し質問しているわけではないですが、名前解決の問題、ということで類似と判断しました) (この質問の回答では、スレッド起こして独自にタイムアウト監視するか、`/etc/resolv.conf`をチューニングすれば可能、と回答しているようです) > > Pass timeout to socket.getaddrinfo > > > なお、`gethostbyaddr`は関数なので、socketオブジェクトから呼び出せないのは仕様通りかと思います。