2012-11-05 195 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