• 締切済み

socket通信でレスポンスを受け入れないようにするにはどうすればいいですか?

socket SOCKET,2,1,0; select((select(SOCKET),$|=1)[0]); connect(SOCKET,pack('Sna4x8',2,80,scalar(gethostbyname('www.test.test')); print SOCKET "GET /test.cgi HTTP/1.1\r\n\r\n"; こんな感じでhttp://www.test.test/test.cgiをリクエストしているのですが、結果がわかっているので、レスポンスが必要ありません。 どうもリクエストが終わると<SOCKET>を実行しないでも勝手にレスポンスをサーバから読み込んでいるみたいです。 (なのでリクエストを送った後、ある程度の時間をおいてオフライン状態にしても<SOCKET>からレスポンスを読み取れます) レスポンスの結果は分かっているので読み込みたくないのですが、どうすればいいのでしょうか?

  • ie000
  • お礼率0% (0/10)
  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

closeを使えば、その時点で接続が切れるはずです。 もしくは、相手先のサーバが対応していれば、GETの代わりにHEADを使うと言うのはいかがでしょう??

関連するQ&A

  • 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
  • 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
  • HTTPレスポンスの終端はどうわかる?

    MacOSX、C言語でsocket(),writeなどを使ってサーバにリクエストを送り レスポンスを標準出力しようとしています。 とりあえずレスポンスをbuf[BUFSIZ]にreadさせようとしているのですが、 レスポンスの内容のサイズがBUFSIZ以上だった場合、繰り返しreadさせる 必要があります。 なので(かなり簡潔に書きますが) while(1) if(buf[i]==EOF){break;} n=read(socket,buf,sizeof(buf)-1); みたいなことを考えました。がこれだとループが止まってくれません。 延々と読み込んでは表示してくれます。。。 たぶんHTTPレスポンスの終端がEOFだと思ったのが違うのだと思います。 HTTPレスポンスの終端というのはどう判断したらよいのでしょうか。 よろしくお願いいたします。

  • 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で入手したデータを抜き出したい

    他サーバのHTMLから部分的に抜き出したいと思っています。 他サーバのHTMLを表示する所までは出来たのですが、抜き出す所が出来ずに困っています。 私が抜き出そうと、表示のwhile文内を下記に変えた所、何も表示されなくなりました。  if( $_ =~ m/抜き出したい頭のキーワード/ ){ $flag = 1;}  if( $_ =~ m/表示したい尾のキーワード/ ){ $flag = 0;}  if( $flag eq 1){ print $_;} このwhile文内には変数に代入するとどうもNGのようです。 教えてGooの過去ログにも同様の質問があったのですが、 解決に至っていませんでした。ご教示願います。 ↓現在のソースコード ---------------------------- #!/usr/local/bin/perl -w use strict; use Socket; # Socket モジュールを使う # 接続先ホスト名 my $host = 'www.xxxx.co.jp'; # HTTP プロトコルを使う my $port = getservbyname('http', 'tcp'); # ホスト名を、IP アドレスの構造体に変換 my $iaddr = inet_aton($host) or die "$host は存在しないホストです。\n"; # ポート番号と IP アドレスを構造体に変換 my $sock_addr = pack_sockaddr_in($port, $iaddr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n"; # 指定のホストの指定のポートに接続 connect(SOCKET, $sock_addr) or die "$host のポート $portに接続できません。\n"; # ファイルハンドル SOCKET をバッファリングしない select(SOCKET); $|=1; select(STDOUT); # WWW サーバに HTTP リクエストを送る print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; # ヘッダ部分を受け取る while (<SOCKET>){ # 改行のみの行ならループを抜ける m/^\r\n$/ and last; } # ボディ部分を受け取り、表示 while (<SOCKET>){ print $_; }

    • ベストアンサー
    • 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
  • HTTP POST によるレスポンスCGIについて

    HTTP POST によるレスポンスCGIについて いつも大変お世話になっております。 タイトルのシステムの組み方についてご質問がございます。 「内容」 決済システム会社からのリクエストに対するレスポンスを返すCGIを作成します。 「仕様」 通信方法:HTTP POST キャラクタセット:Shift-JIS text/csv(←ここの意味もわかりません) 仕様書には 「Httpリクエストに対するレスポンスとしてHTTPボディ部に記述してください」 例) 処理OKの場合:OK,    処理NGの場合:NG,既に完売済み CSV形式(カンマ区切り) とあります。 私のスキルとしては、「html」「PHP」が書ける程度です。 javaやPerlは全然分かりません。 仕様は単純かと思いますが、リクエストに対して自動でレスポンス(OKかNG)を返す仕組みが分かりません。 ご教授願いますでしょうか。

    • 締切済み
    • CGI
  • HTTP レスポンスヘッダ

    URLを指定してHTTP レスポンスヘッダ等が確認できるサイトで、 Request typeをGETやPOSTが選択可能なところを探しています。 少し探した結果、 http://web-sniffer.net/ というところが見つかりましたが、このようなサイトが他にもあれば教えてください。 宜しくお願いします。

  • php fsockopenの文字化けについて

    PHPプログラミングの初心者です。 現在Yahooファイナンスのページから為替情報を自動で取得するスクリプトを作成しています。 サーバーからの応答は「HTTP/1.1 200 OK」となっているのですが、取得したデータが全て文字化けして表示されます。 mb_convert_encodingを使っても結果は同じでした。 どのようにすれば文字化けを解消できるのでしょうか? 下記がスクリプトの内容です。よろしくお願いいたします。 <?php /* リクエストライン */ $request = "GET / HTTP/1.0\r\n"; $request .= "Accept: */*\r\n"; $request .= "Accept-Language: ja\r\n"; $request .= "User-Agent: PHP-".phpversion()."\r\n"; $request .= "Accept-Encoding: gzip, deflate\r\n"; $request .= "Host: finance.yahoo.co.jp\r\n"; $request .= "Connection: Keep-Alive\r\n"; $request .= "\r\n"; $fp==""; $fp =@fsockopen("finance.yahoo.co.jp", 80); /* 要求データ送信 */ fputs($fp, $request); /* 応答データ受信 */ $response = ""; while (!feof($fp)) { $response.= fgets($fp); } /* 接続を終了 */ fclose($fp); /* ヘッダ部分とボディ部分を分離 */ $DATA = split("\r\n\r\n", $response, 2); /* リクエストヘッダをコメントアウトして出力 */ echo "<!--\n".$request."\n-->\n"; /* レスポンスヘッダをコメントアウトして出力 */ echo "<!--\n".$DATA[0]."\n-->\n"; /* メッセージボディを出力 */ echo $DATA[1]; ?>

    • ベストアンサー
    • PHP
  • C言語でHTTP1.1のキープアライブを使用したい

    ご存知であればお知恵を貸してください。 C言語のソケットプログラムで、HTTP1.1のキープアライブを有効にする方法を調べています。 経緯としては、Unix(SystemV系)のC言語でHTTPクライアントを作成しました。 GET(またはPOST)メソッドのHTTPリクエストを発行して、そのレスポンスをコンソールに表示するような一般的なソケットプログラムです。 (socket() → connect() → send() → recv()と言った流れです) 連続してリクエストする場合があるので、connect()で作成したコネクションをプログラム中で使用し続けたいのですが、一度のリクエスト、レスポンスでコネクションが切断されてしまいます。(HTTPの仕様) HTTP1.1で定義されているキープアライブを使用すればよいと考え、ソースコードにおいて以下の対応を追加しました。 ・setsockopt()でSO_KEEPALIVEを有効にする。(socket()とconnect()の間で呼び出し) ・送信するHTTPヘッダのプロトコルバージョンを1.1として、Host:ホスト名、Connection: Keep-Aliveを設定 HTTP1.1でキープアライブを有効にしている自宅のApache2.2がターゲットなのですが、上記対応後もコネクションが切断されてしまいます。 Apacheについては、環境変数の出力結果からHTTP1.1でキープアライブが有効になっていることは確認済みです。 HTTPクライアントプログラムについては、都度コネクションを張れば問題なく動作するので基本部分は間違っていないと考えています。 HTTPクライアントプログラムで、キープアライブを有効にするための何かが欠けているのだと推測しているのですが、どなたか何かお気づきのことはございませんでしょうか? #手元にソースコードがないために、掲載できないので漠然とした質問になってしまいました。すみません。

専門家に質問してみよう