Perlのわかる方教えてください。IPアドレスからドメイン名を求めるにはどうすればいいのでしょうか?

[上に] [前に] [次に]
じぇい [E-Mail] 1999/04/27(火) 10:01:49
現在Perlを使って掲示板を作っています。
それでアクセス解析の機能を付けようと思うのですが、ホスト名が表示されないとき、IPアドレスからドメイン名を求めるにはどうすればいいのでしょうか?
http://www.phoenix-c.or.jp/~drinks/cgi-bin/env/
env_drinks.cgi
上記のページでは”getbyaddr を実行してDNSを参照します。”という説明が書いてあったのですが、何のことかわかりません。
gethostbyaddrという関数はよく見るのですが、 getbyaddr という関数の使い方がわかりません。
どなたか教えていただけないでしょうか?

B-Cus 1999/04/27(火) 11:31:16
../199904/99040166.htm

じぇい [E-Mail] 1999/04/27(火) 15:08:40
う〜む、、ご教授ありがとうございます。^^;
しかし、今だ悩みが解決しておりません。。。

上記に書かれたページでは、

gethostbyaddrを使えばIPアドレスからドメイン名への変換が行え
る、もしそれで変換できなければもともと対応するホスト名を持っていないのでしょう。

、、、と書いてありました。
僕は現在他人の作った掲示板を他人の作ったライブラリを使い改造しているのですが、その掲示板ではgethostbyaddrを使ってもIPアドレスからドメイン名への変換ができなかったのですが、

http://www.phoenix-c.or.jp/~drinks/cgi-bin/env/env_drinks.cgi

上記のページでは確かにIPアドレスからドメイン名への変換が行われております。上記のページでは何か特別なことをしているのでしょうか?

(Perl初心者なもので、つまらないことを聞いて申し訳ありません。)

mm 1999/04/27(火) 18:48:26
上の環境変数のページのネタ元はウチのようですね(笑い)

それはともかく、以前ここで うふ!さんに教えて頂いたのですが、
WebサーバーがREMOTE_HOSTにドメインネームを設定しない場合、
REMOTE_ADDRをコピーするのではなく、空にすることもあるようです。
env_drinks.cgi にもそのような記述がありますね。

そんな訳で、if ($ENV{'REMOTE_HOST'}eq$ENV{'REMOTE_ADDR'})では
うまくいかない場合があるようなので、今は下のようにしてます。
if ( !$ENV{'REMOTE_HOST'} || $ENV{'REMOTE_HOST'}eq$ENV{'REMOTE_ADDR'} ){
if ( !($host=gethostbyaddr(pack('C4',split(/\./,$ENV{'REMOTE_ADDR'})),2)) ){
$host = $ENV{'REMOTE_ADDR'};
}
}
else { $host = $ENV{'REMOTE_HOST'}; }

うちのソースも更新しなければ…(^^;

じぇい [E-Mail] 1999/04/27(火) 21:31:49
mmさんですか!
話が早いです。
なぜならmmさんのお作りになった悪戯防止ライブラリを現在使わせてもらっているのです。^^;

そのライブラリの一番上に記述している

$DomainName = $ENV{'REMOTE_HOST'}eq$ENV{'REMOTE_ADDR'}?gethostbyaddr(pack('C4',split(/\./,$ENV{'REMOTE_ADDR'})),2)||$ENV{'REMOTE_ADDR'}:$ENV{'REMOTE_HOST'};

という部分をおおせになられたとおりに m(_ _)m(ははぁ〜、)

if ( !$ENV{'REMOTE_HOST'} || $ENV{'REMOTE_HOST'}eq$ENV{'REMOTE_ADDR'} ){
         if ( !($DomainName = gethostbyaddr(pack('C4',split(/\./,$ENV{'REMOTE_ADDR'})),2)) ){
         $DomainName = $ENV{'REMOTE_ADDR'};
         }
       }

というふうに書き換えたのですが、今だサブルーチンcheck_userの第一引数で1を指定したときにエラーの表示が出てしまいます。そこを0に直すとエラーが表示されなくなるのですが、、。
ライブラリのほうは上記の部分以外に改造はしていません。

そして不思議なことに、、時間帯によっては、たまに REMOTE_HOST にホスト名がきちんと表示されるのですが、(mmさんのところの例のページで。)、そのときでさえ第一引数で1を指定するとエラーメッセージが表示されます。
こ、、これは一体どんな原因が考えられるのでしょうか?
掲示板の改造に関してはミスはないと思うのですが、、、。
ソースに付いてはほぼ理解してるつもりです。
、、といっても、、それ(僕のミス)以外に原因が見つからないし、、、。

mm 1999/04/28(水) 00:05:01
えっと、エラーと関係あるかどうかは分かりませんが、
下記の部分が抜けてます。
else { $DomainName = $ENV{'REMOTE_HOST'}; }

それはともかく、
http://www2s.biglobe.ne.jp/~cru/library/zddbbs/cgi-bin/zddbbs.pl
に修正したスクリプトを上げておきますので、こちらで試して
頂けますでしょうか?
この件、以前から気にはなってたのですが、確認が取れなかったのです。
もし、これでうまく行けば、汎用のCGIを作成している人に
役に経つ情報となるはずなので、ここで結果を知らせて下さい。

また、エラーの件は、うちのスクリプトの問題なので、
ウチの掲示板に移動しましょう。

じぇい [E-Mail] 1999/04/28(水) 01:21:53
[[解決]]
わかりました。そうさせていただきます。

mm 1999/04/29(木) 00:52:43
じぇいさんのサーバーを調べた結果、REMOTE_HOSTにはREMOTE_ADDRと
同じIPアドレスが設定されていました。
従って、今回の件は、! $ENV{'REMOTE_HOST'} を判定するかどうかとは
無関係です。

ただし、REMOTE_HOST が設定されないか空になる場合があるという
疑問はまだ完全に解消された訳ではないので、もし確認された方がいらしたら
教えて頂けませんでしょうか?

コルン 1999/04/29(木) 01:37:26
 >ただし、REMOTE_HOST が設定されないか空になる場合があるという
 >疑問はまだ完全に解消された訳ではないので、もし確認された方がいらしたら
 >教えて頂けませんでしょうか?
 空に成る(設定されてない)事って、よく在る事じゃないでしょうか?
 少なくとも、オイラがメインに使っていた海外の無料Webスペースの
2つは、空でした。(3ヶ月くらい前の話かな?・・・今は、別の
無料Webスペースを使ってるからなぁ)
 ごく当然、当たり前の事っすよ?(苦笑)

mm 1999/04/29(木) 02:43:01
情報ありがとうございます。
実際に確認されている方がいるということで安心しました。

[上に] [前に] [次に]