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

通过为andfsockopen传入参数来查看返回的错误:errnoerrstr

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