CGI-BBS > CGI > Perl > クライアントのIPアドレスから、ホスト名を知る


カレッヂ
カレッヂ


質問者 よしまさ  投稿日 3/2(金) 23:45:53
掲示板の中には、投稿者の(プロバイダの?)ホスト名が表示されるところがありますが、
そのような機能は、どのようにして作っているのでしょうか?

$addr=$ENV{'REMOTE_ADDR'};
$host=gethostbyaddr(pack('C4',split(/\./,$addr));

とすればよいと、あるwebに書かれていたのですが、どうもうまく機能してくれません。
cgiを動かすサーバーの種類にもよるのでしょうか?
私はfreewebにcgiを置かせてもらっています。

どなたかご存知の方がおられましたら、宜しくお願いします。m(_ _)m
回答者 さくら  [削除]  投稿日 3/3(土) 03:24:19

ホスト名は必ず取得できるとは限りませんが一応下記コードをお試し下さい。
取得できなければ、$addrの値が入ります。

$host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr;


質問者 よしまさ  [削除]  投稿日 3/3(土) 13:29:38
ご回答ありがとう御座います。

なるほど、やっぱり必ず取得できるものはないのですか。

perlの環境変数に
$ENV{'REMOTE_HOST'}
というものがありますが、これは内部でgethostbyaddrを実行しているのでしょうか?
となると、これも機能しないですね。

もう少し考えてみたいと思います。

#JavaScriptの機能か?
回答者 羊相談員  [削除]  投稿日 3/3(土) 17:04:32
>perlの環境変数に
>$ENV{'REMOTE_HOST'}
>というものがありますが、これは内部でgethostbyaddrを実行しているのでしょうか?
>となると、これも機能しないですね。

$ENV{'REMOTE_HOST'}が取得できなくてもgethostbyaddr関数が使用できないとは限りません。
私が使っているサーバ(http://degital.net/)ではREMOTE_HOSTは取得できませんがgethostbyaddr関数は使えます。
回答者 馬駒  [削除]  投稿日 3/3(土) 22:31:46
gethostbyaddrは一般的に環境変数REMOTE_HOSTが取得できないときの代替手段として使われます。
回答者 さくら  [削除]  投稿日 3/4(日) 01:18:42
>$ENV{'REMOTE_HOST'}
というものがありますが、これは内部でgethostbyaddrを実行しているのでしょうか?

実行していません、$ENV{'REMOTE_HOST'} はクライアントがリクエストを送るときに、
サーバー情報が、付加されて送られています。それを、リクエストを受け取ったサーバーが取得し、
環境変数にセットしています。しかし多くのサーバーは、ホスト名を送信しませんので、
$ENV{'REMOTE_HOST'}では、ホスト名を取得できない事になります。

gethostbyaddr はバイナリパックされた、4バイト長のネットワークアドレスを、
対応するホスト名に変換しています。
gethostbyaddr はリストコンテキストをあたえてやると、
ホスト名、エイリアス(別名)、アドレスタイプ、アドレス長、アドレスリスト、
を返します。

それと、気になったのですが、私が昨日書いたコードを試して見ましたか?
貴方が、書いたコードとは、ちょっと違います。
gethostbyaddr は引数に、バイナリパックされた、4バイト長のネットワークアドレスと、
アドレスタイプを、受け取ります。貴方のコードには、アドレスタイプがなかったので
追加したものを書きました。
2 という数値です。通常使われているインターネットIPプロトコルは、
IPv4 というもので、アドレスタイプはAF_INET、定義されている値は 2 です。
このアドレスタイプによって、gethostbyaddr はホスト名を検索しますので、
必ず、指定するようにしましょう。

ただし、それでもなおホスト名が取得できない場合もありますが、
その場合、未定義値が返されるので、その場合は、アドレスを代入
するように、|| 演算子を使って、|| $addr と書いたわけです。



質問者 よしまさ  [削除]  投稿日 3/4(日) 03:20:43
みなさま、ご丁寧にありがとう御座います。

さくらさん。ご指摘のように、2という数値が抜けていました。
しかし、修正したものでもホスト名を取得することができませんでした。
サーバーが処理を禁止しているのでしょうか。

それにしても、皆さんの貴重なご意見に大変感謝です。
勉強になります。
回答者 羊相談員  [削除]  投稿日 3/4(日) 14:39:01
>サーバーが処理を禁止しているのでしょうか。

freewebだったら負荷軽減のために禁止しているかもしれません。

返信(回答)する


Web裏技