PHP Socket GET请求

时间:2012-11-05 07:59:49

标签: php sockets

我使用以下脚本向网站发送GET请求但是,我一直收到错误,服务器没有响应。

  1. 我已经运行wireshark来查看因运行此脚本而产生的任何流量,但没有流量。
  2. 我可以从浏览器连接到该站点,我也可以使用file_get_contents函数检索内容,但是使用套接字,我无法做到。
  3. 以下是使用套接字将请求发送到站点的代码,如果连接不成功,则返回错误:“服务器无响应”。

    <?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无响应

2 个答案:

答案 0 :(得分:1)

通过传入fsockopenerrno的参数来查看errstr返回的错误:

if (!($sock = fsockopen($host,80,$err_no,$err_str)))
    die($err_no.': '.$err_str);

答案 1 :(得分:1)

$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