8

次の値を与える仮想マシンを実行しており、コードが実行されると (Web サイトで何らかのアクションを実行することによって)

socket.getfqdn()
x-vps-01.abc.it

socket.gethostname()
x-vps-01

socket.gethostbyname(socket.getfqdn())
216.185.103.35

socket.gethostbyname(socket.gethostname())
78.47.171.19

ターミナルにログインして上記を実行すると、常に 78.47.171.19になることに注意してください。

4

2 に答える 2

12

Linuxボックスであなたがしたことを試しました。実行している OS とネットワークの状況を記載する必要があるかもしれません。

システムコールの結果からのデータのみを印刷しながら、ファイルで提供される情報を使用しstraceていることがわかりました。基本的に、1 つはネットワーク モジュールを要求し、もう 1 つはカーネルを要求すると言えます。どちらもあなたの質問に対する答えを持っていますが、その問題についての見解が異なるため、必ずしも一致するとは限りません。socket.getfqdn()/etc/hostssocket.gethostname()uname()

呼び出しsocket.gethostbyname()は、ネットワーク モジュールにもクエリを実行します (/etc/hosts私の場合は、ファイルの内容を検索して一致するものを探します)。カーネルの答えをネットワーク関数に与えることは、実際にすべきことではありません。それにもかかわらず、ほとんどの場合、これは機能します。奇妙な結果を生み出す場所を見つけました。

于 2012-11-09T14:37:53.717 に答える