• ベストアンサー

socket経由でHTMLを表示

するために test.pl: #!/usr/local/bin/perl use Socket; $addr=(gethostbyname("www.ndl.go.jp"))[4]; $name=pack("S n a4 x8",2,80,$addr); socket(S,PF_INET,SOCK_STREAM,0); connect(S,$name); binmode(S); select(S);$|=1;select(stdout); print S "GET /index.html HTTP/1.1\n"; print S "Host:www.ndl.go.jp\n\n"; print "Content-type: text/html\n\n"; while(<S>){print;} close(S); をPerlが実行できるプロバイダのスペースにアップして Meのie6ブラウザからtest.plを表示させるとエラーになります どうしたらエラーを回避して "http://www.ndl.go.jp/index.html"(国立国会図書館) を表示することができるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#9431
noname#9431
回答No.3

一番疑わしいのはNiftyが機能制限していることです。 質問欄のコードは正しくcgiの設置をすれば必ず動きます。 以前、確か、gethostbynameも機能制限うけているという結論になった御質問をしてませんでしたっけ? そもそも、Socketモジュール自体使えないようになっているのかもしれません。 use Socket; ですでにエラーになるのでは?

guuman
質問者

お礼

ありがとうございます gethostbynameも使えません いろいろ制限されていて大変です 明日Niftyに聞いて見ます

その他の回答 (3)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.4

NiftyではPerlの標準モジュールは一切使えません。(標準がだめなら標準で入っていないモジュール類ももちろん用意されていません) http://homepage.nifty.com/cgi/index.htm?d_cgi1 ここの下にある「ご注意」の2番目に書いてあります。 (文書的にはjcode.pl等がないだけに思えますが実はSocket.pm等Perlに標準添付されているはずのモジュール類も用意されていません)

guuman
質問者

補足

ありがとうございます Niftyに電話するとやってうまくいかなければできないと判断するしかないとのことです そこでFedoraCore3のPCを使いたいのですが 外にアクセスに行くとエラーになります 具体的には #!/usr/local/bin/perl print "Location:http://hpcgi.nifty.com/x.pl\n\n"; のように外側のPerlCGIに移動しようとするとエラーになります 何か設定がいるのでしょうか? 同一PC同一ディレクトリにあるPerlCGIを使う分にはエラーにはなりません なおPHPから外部のPerlCGIに移動することはできます

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

どんなエラーがでているのかわからないのでナンですが、サーバーからのGETに対するメッセージ HTTP/1.1 200 OK Date: Sun, 06 Feb 2005 09:05:29 GMT Server: Apache Last-Modified: Fri, 04 Feb 2005 01:20:28 GMT ETag: "5804c-2f71-49aa2f00" Accept-Ranges: bytes Content-Length: 12145 Content-Type: text/html がエラーを起こしているのではないでしょうか? そこで、 while(<S>){print;} の部分を <!DOCTYPEから</HTML>までを表示するということで while(<S>){ print if m|<!DOCTYPE|..m|</HTML>|; } としてみたらどうでしょう?

guuman
質問者

補足

ありがとうございます #!/usr/local/bin/perl use Socket; $addr=(gethostbyname("www.ndl.go.jp"))[4]; $name=pack("S n a4 x8",2,80,$addr); if(!socket(S,PF_INET,SOCK_STREAM,0)) { print "Content-type: text/html\n\n"; print "out1<br/>"; exit; } if(!connect(S,$name)) { print "Content-type: text/html\n\n"; print "out2<br/>"; exit; } binmode(S); select(S);$|=1;select(stdout); print S "GET /index.html HTTP/1.1\n"; print S "Host:www.ndl.go.jp\n\n"; print "Content-type: text/html\n\n"; while(<S>){print if m|<!DOCTYPE|..m|</HTML>|;} close(S); でやりましたが Niftyプロバイダサーバでやっているのでエラーの詳しいメッセージが出ません 実行エラー CGIの実行時にエラーが発生しました 。 というそっけないメッセージがNiftyのロゴを従えてブラウザ画面に表示されます 基本的に送り方を間違えていることは無いのでしょうか? コマンドラインではうまくいってますが コマンドライン実行用スクリプトをそのまま使っても大丈夫なのでしょうか?

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

まずは、スクリプトのどこでエラーになっているかを確定するために、各関数の戻り値チェックなどのコードを追加してみては。 ぜんぜんエラーハンドリングがされてないようですので。 それとプロバイダに、サーバから外部への接続を許可しているかを確認すべきかと。 もしかすると追加料金が必要なのかも。

guuman
質問者

補足

ありがとうございます # #!/usr/local/bin/perl use Socket; $addr=(gethostbyname("www.ndl.go.jp"))[4]; $name=pack("S n a4 x8",2,80,$addr); socket(S,PF_INET,SOCK_STREAM,0); connect(S,$name); binmode(S); select(S);$|=1;select(stdout); print S "GET /index.html HTTP/1.1\n"; print S "Host:www.ndl.go.jp\n\n"; # print "Content-type: text/html\n\n"; while(<S>){print;} close(S); のように質問のコードから2行を取り除いたものが クライアントパソコンのドスプロンプトで perl test.pl を実行したら動きます そこで2行を追加してプロバイダサーバにアップして クライアントパソコンブラウザからアクセスしました そこでエラーが出ます test.plは実行属性にはしてます 明日プロバイダに聞いてみます

関連するQ&A

専門家に質問してみよう