カレッヂ |
質問者 よしまさ
投稿日 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裏技 |