• ベストアンサー

ソケットの使い方が分からない

ので動作を見るためにとほほを見て WidnowsMeで x.pl: 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.0\r\n\r\n"; while(<S>){print;} close(S); を作り perl x.pl を実行すると HTTP/1.1 400 Bad Request Date: Fri, 04 Feb 2005 15:40:15 GMT Server: Apache Content-Length: 226 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> </body></html> が帰ってきました なお http://www.ndl.go.jp/index.html は国立国会図書館のページでブラウザのアドレス欄に入れると正常に見れます どのように修正すればよいでしょうか?

  • guuman
  • お礼率86% (1043/1206)
  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • proust
  • ベストアンサー率57% (62/108)
回答No.1

index.htmlの前に/をつけます。 print S "GET /index.html HTTP/1.0\r\n\r\n"; GETの次の部分は、参考URLのRFCでいうところのabs_path (絶対パス)になりますので、「/」が必要になります。 上の修正でとりあえず通りますが、 最近は以下のような書き方をする方が多いのでは ないかと思います。 #!/usr/bin/perl use IO::Socket; my ($sock) = IO::Socket::INET->new( PeerHost => "www.ndl.go.jp", PeerPort => 80, Proto => 'tcp'); eval { $sock->print("GET /index.html HTTP/1.0\r\n"); $sock->print("\r\n"); print <$sock>; }; $sock->close(); if($@) { die $@; }

参考URL:
http://www.w3.org/Protocols/rfc2616/rfc2616.html
guuman
質問者

お礼

ありがとうございます 動きました use Socket; $server = 'www.ndl.go.jp' ; $port = getservbyname('http','tcp'); $struct = sockaddr_in($port,inet_aton($server)); socket(S,PF_INET,SOCK_STREAM,0) || die("Socket失敗 $!"); connect(S, $struct ) || die("接続失敗1 $!") ; select(S); $| = 1; select(STDOUT); $respons = <S> ; unless($respons =~ /^220/) { close(S);die("接続失敗2 $!") ; } close(S); select(STDOUT); print "正常に接続されました。\n"; が接続失敗1を出すのですがその原因も教えていただければ幸いです

その他の回答 (1)

noname#9431
noname#9431
回答No.2

#1の方が仰るとおり、絶対パスでしていします。 あと、HTTP/1.1の書き方では print S "GET /index.html HTTP/1.1\n"; print S "Host:www.ndl.go.jp\n\n"; かな。

guuman
質問者

お礼

ありがとうございます print S "GET /index.html HTTP/1.1\n"; print S "Host:www.ndl.go.jp\n\n"; でも動きました これでいこうと思います

関連するQ&A

  • 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"(国立国会図書館) を表示することができるでしょうか?

    • ベストアンサー
    • Perl
  • perlのソケット通信について

    perlのソケット通信でwebブラウザーのようなものを製作中なのです。 http://tohoho.wakusei.ne.jp/wwwperl2.htm#socketを参考にしたのですが、 yahooは表示されますが、xrea系のサイトのような特定のサイトが閲覧できず(どちらかというと特定のサイトのみ閲覧できる)、NotFoundかDNSエラーになります。 とほほのWWW入門のサンプルの他に追加する項目などはあるのでしょうか?よろしくお願いします。 現在の構文は以下の通りです browser.cgi 改行コードLF、漢字コードEUC ------------- #! /usr/bin/perl print "Content-type:text/html\n\n"; $addr = (gethostbyname("www.xrea.com"))[4]; $name = pack("S n a4 x8", 2, 80, $addr); socket(S, 2, 1, 0); connect(S, $name); binmode(S); select(S); $| = 1; select(stdout); print S "GET /index.php HTTP/1.0\n\n"; while (<S>) { print; } close(S);

    • ベストアンサー
    • Perl
  • tera termの使い方の質問です

    ネットワークの勉強をしようと思い、下記のサイトにたどり着きました。 http://www.atmarkit.co.jp/fnetwork/rensai/tcp01/01.html#allergy そこでの例にそいながらteratermをインストールしてiniファイルを書き換え、ソフトを起動させ、 指示されたアドレス(GET http://www.atmarkit.co.jp/fnetwork/accesstest/at.html)を入力すると、 HTTP/1.1 400 Bad Request Connection: close Content-Length: 170 <HTML><HEAD> <TITLE>400 Bad Request</TITLE> </HEAD><BODY> <H1>Bad Request</H1> Your browser sent a request that this server could not understand.<P> </BODY></HTML> と表示され、うまくいきません。このエラーの解決策と原因を教えていただきたいです。 どなたかわかる方ご教授お願いいたします。 追記 インストールの際はjapaneseを最初に選び、次にDOS系のキーボードを選びました。 iniファイルはインストールしてできたフォルダの中のファイルを書き換えました。 下記でも同じような悩みの方が質問されていましたが、私は入力はできるので少し状況が違う気がします。 http://okwave.jp/qa/q3486023.html

  • socketを使って外部のファイルを呼び込む

    $Host = 'abc.hogehoge.co.jp'; $Page = "/test_order.cgi?pass=1234&id=1234' $Addr = (gethostbyname($Host))[4]; $Name = pack("S n a4 x8", 2, 443, $Addr); socket(S, 2, 1, 0); connect(S, $Name); binmode(S); select(S); $| = 1; select(stdout); print S "GET $Page HTTP/1.0\r\n\r\n"; $Data = ''; while (<S>){ $Data = $_; } close(S); print"$Data"; 現在ある決済システムを組み込もうとしております。 上のように外部ホストのアクセスしてパスワードやID、その他あるのですがそれで接続していてもどうにも$Dataに出力されません。 print S "GET $Page HTTP/1.0\r\n\r\n"; とありますが外部ファイルはhtmlファイルではありません。たんなるテキスト文字が出力されるはずです。 直接ブラウザに https://abc.hogehoge.co.jp/test_order.cgi?pass=1234&id=1234' とたたくとテキストが出力されます。 なにかまちがっているのでしょうか? 恐れ入りますがご教授お願いします

    • ベストアンサー
    • CGI
  • ホームページのヘッダ部分について

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML LANG="JA"> <HEAD> <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=Shift_JIS"> <META HTTP-EQUIV="CONTENT-STYLE-TYPE" CONTENT="text/css"> <META HTTP-EQUIV="CONTENT-SCRIPT-TYPE" CONTENT="text/javascript"> <TITLE>○○○○</TITLE> <LINK REL="STYLESHEET" TYPE="text/css" HREF="css1.css"> <meta name="keywords" content="△,△,△,△,,△,△,"> <meta name="description" content="●●●●●"> </HEAD> <BODY> … となっているのですが、無駄な部分はありますか? 順番などは合ってますか? また、こうしたほうがいい、などとアドバイスがあればぜひよろしくお願いいたします。

  • 他のWWWサーバーからHTMLを得る

    Perlにて外部サーバーよりHTMLを読み込むスクリプトを書いていますが 万策付きお手上げとなりました。なんとか実現したく御願い致します。 環境から申し上げます。 作成パソコン OS → WIN98 ウェブサーバー → ANHTTPD ActivePerl 5.8.7 Build 813 です。 以下がコードです。 use Socket; use Net::hostent; #ローカルホスト名 $localhost='localhost'; #リモートホスト $remotehost='127.0.0.1'; #得たいページのURL $page = 'http://127.0.0.1/index.html'; #接続し、ファイルハンドルSHにつなぐ。 $rh = gethost($remotehost); $lh = gethost($localhost); $proto = getprotobyname('tcp'); socket(SH,AF_INET,SOCK_STREAM,$proto) or print "error\n"; $port = getservbyname('http','tcp'); $socket_template='S n a4 x8'; $localhost_port = pack($socket_template,AF_INET,0,$lh->addr); $remotehost_port = pack($socket_template,AF_INET,$port,$rh->addr); bind(SH,$localhost_port) or print "error\n"; connect(SH,$remotehost_port) or print "error\n"; select SH; $|=1; #GETでリクエストを送信。 print SH "GET $page\n"; #得られたページの内容を@HTMLに入れる。 while(<SH>){ push @HTML,$_; } close SH; select STDOUT; #追加書き込みでhtml.txtを開く。 open(FILE, ">> html.txt"); #@HTMLがhtml.txtに書き込めない。 foreach (@HTML){ print FILE $_; } close(FILE); print <<EOD; content-type: text/html <html> <head> <title>新規登録</title> <link rel="stylesheet" href="shinki.css" type="text/css"> </head> <body> <h1>サーバーチェック</h1> <br><br> HTMLさくせいしました。<br> @HTML </body> </html> EOD exit; 以上です。 当然ながらブラウザにも表示されません。 コードの細かい事などもよく分かっていません。 お手数ですが 外部ファイルの取得が出来ますよう ご教授宜しく御願い致します。

    • ベストアンサー
    • Perl
  • socketを使用したスクリプトがうまく動きません

    お世話になります。教えて!gooを初めて利用する者です。 Perlは本などを見ながら何とか動かせるレベルです。 この度、socketを使って他サイトを読み込む実験をしてみたところ、以下のコードでGoogleのトップページは読み込めましたがYahoo!のトップは何度やってもちゃんと読み込めません。 失敗している部分は、相対パス指定になっている部分のようです。 リンクや画像など、「http://www.yahoo.co.jp/~」となるはずのところが、「http://127.0.0.1/~」となってしまっています。 また、LWPモジュールというものも試してみましたが、こちらはGoogleのトップの読み込みも失敗しました。症状は上と同じです。 コードは本や有名サイトからそのまま引用してもダメで、多少いじってもやはりダメでした。 一人で解決するのは限界だと思いましたので、分かる方いらっしゃいましたらご助言をお願いいたします。 (試したコードの例↓) use Socket; $addr = (gethostbyname("www.google.co.jp"))[4]; $name = pack("S n a4 x8", 2, 80, $addr); socket(S, PF_INET, SOCK_STREAM, 0) || die "socket"; connect(S, $name) || die "connect"; binmode(S); select(S); $| = 1; select(STDOUT); print S "GET / HTTP/1.0\r\n\r\n"; while (<S>) { print; } close(S);

  • socket使用時の環境変数(REMOTE_ADDR)について

    色々調べても結局わかりませんでしたので もしお分かりになる方がいらっしゃれば 教えて頂ければ幸いです。 socketを使用するAというプログラムを作ったのですが、 そのプログラムからBというプログラムを呼び出した時、 Aに取得されるREMOTE_ADDRは、私のREMOTE_ADDRになるのですが、 Bに取得されるREMOTE_ADDRは、サーバのREMOTE_ADDRになってしまいます。 Bに対しても私のREMOTE_ADDRを取得させたいのですが、 方法はありますでしょうか? 具体的なSOCKET使用機構は以下のようになっております。 use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)', Proto => 'tcp'); select($socket); $|= 1; select (STDOUT); print $socket "POST $path HTTP/1.0",CRLF,CRLF; close($socket); どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 検索できません・・ホームページ

    ホーページを作り たちあげました。検索してもらえるように 登録しましたが いっこうに・・ 下のようなものでは 検索されませんか? チェックしてください お願いします キーワードの カンマがだめなのですか? 教えてください <HTML><BODY><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from url=(0039)http://www.****.com/mphone/index.html --> <HTML><HEAD><TITLE>○○○</TITLE> <META content="MSHTML 6.00.2716.2200" name=GENERATOR> <META http-equiv=Content-Type content=text/html;CHARSET=x-sjis><X-SAS-WINDOW RIGHT="1012" LEFT="0" BOTTOM="620" TOP="0"><X-SAS-REMOTESAVE dir=mphone/ FILE="index.html" USER="○○" SERVER="○○.com"> <META content=△△,○○,■■ name=keywords> <META content=○○・■・○等へ○○ペイントを行なっております。 name=description></HEAD><BODY BACKGROUND="img/001.gif"> <BODY text=#000000 vLink=#000000 aLink=#000000 lLink=#000000 > <HTML><BODY><title>○○○</title> <body background="m.gif">

  • このソースどういう意味ですか【JavaScript】

    <HTML> <HEAD> <TITLE>JavaScript Sample</TITLE> <META HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript"> </HEAD> <BODY> : <INPUT TYPE="button" VALUE="OK" onClick="~"> : </BODY> </HTML> このソースの中の <META HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript"> の部分ってどういう意味ですか? 特にTypeとHTTP-EQUIVの部分については個別で詳しく知りたいです。 回答よろしくお願いします。

専門家に質問してみよう