1

次のスクリプトを使用して GET 要求をサイトに送信していますが、サーバーからの応答がありませんというエラーが表示され続けます。

  1. このスクリプトを実行した結果として生成されるトラフィックを確認するために、wireshark を実行しましたが、トラフィックはありません。
  2. ブラウザからサイトに接続でき、file_get_contents 関数を使用してコンテンツを取得することもできますが、ソケットを使用するとできません。

ソケットを使用してサイトにリクエストを送信するコードを次に示します。接続が成功しなかった場合、「サーバーからの応答がありません」というエラーが返されます。

<?php

error_reporting(0);
set_time_limit(0);
ini_set("default_socket_timeout", 5);

function http_send($host, $packet)
{
    if (!($sock = fsockopen($host, 80)))
        die( "\n[-] No response from {$host}:80\n");

    fwrite($sock, $packet);
    return stream_get_contents($sock);
}

$host="http://example.com";
$path="/";
$packet  = "GET {$path} HTTP/1.0\r\n";
$packet .= "Host: {$host}\r\n";
$packet .= "Connection: close\r\n\r\n";

http_send($host, $packet);

?>

では、上記のコードで GET 要求を送信できないのは何が問題なのですか?

私には問題ないように見えます.GETリクエストのHTTPリクエストヘッダーを形成し、$packet変数に保存します。

$host は宛先サイト名です。

次に、リクエストを送信する関数 http_send を呼び出します。

エラー出力: [-] http://example.com:80からの応答なし

4

2 に答える 2

3
$fp = fsockopen("127.0.0.1", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /out.php HTTP/1.1\r\n";
    $out .= "Host: 127.0.0.1\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

out.php が含まれています

 <?php
 echo 'got in';

得られた出力

 HTTP/1.1 200 OK Date: Mon, 05 Nov 2012 08:23:11 GMT Server: Apache/2.2.21 (Win32)
     mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By: 
    PHP/5.3.8 Content-Length: 6 Connection: close Content-Type: text/html got in
于 2012-11-05T08:25:31.047 に答える
1

とのfsockopenパラメータを渡すことによって返されるエラーを見てください。errnoerrstr

if (!($sock = fsockopen($host,80,$err_no,$err_str)))
    die($err_no.': '.$err_str);
于 2012-11-05T08:05:15.683 に答える