2012-11-05 146 views
0

我正在使用以下脚本向网站发送GET请求,但是,我不断收到错误,服务器没有响应。PHP套接字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。

错误输出:[ - ]被返回由fsockopen在误差从http://example.com:80

+0

为什么使用套接字而不是file_get_contents和stream_context? – grunk

回答

1

那没有响应由参数通过为errnoerrstr

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

谢谢。我已经知道了。我从目标网站名称中删除了“http://”,它现在可用。 –

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'; 

ou得到的结果

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