2009-09-22 32 views
5

我想發送一個原始的http數據包到網絡服務器,並收到它的迴應,但我無法找到一種方法來做到這一點。即時通訊與套接字和每一個我找到使用套接字發送udp數據包的鏈接。任何幫助都會很棒。PHP如何發送原始HTTP數據包

+0

@Ozzy:note - HTTP使用TCP(流)而不是UDP(數據包)。 – 2009-09-22 23:14:27

+0

aa我看到thx :) – Ozzy 2009-09-22 23:19:11

+0

你爲什麼要實現HTTP?有一個很好的機會cURL會做你想做的,所以你不必重新發明輪子。 – outis 2009-09-22 23:21:46

回答

6

看看從fsockopen manual page這個簡單的例子:

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

到服務器的連接建立與fsockpen$out保存與frwite一起發送的HTTP請求。然後用fgets讀取HTTP響應。

+1

它正是我所需要的,我想我需要重新思考我的包欺騙壽的方法:S – Ozzy 2009-09-22 23:18:39

3

如果你想要做的就是執行GET請求和接收響應的主體,大部分文件功能支持使用網址:

<?php 

$html = file_get_contents('http://google.com'); 

?> 

<?php 

$fh = fopen('http://google.com', 'r'); 
while (!feof($fh)) { 
    $html .= fread($fh); 
} 
fclose($fh); 

?> 

在超過簡單的GET,使用捲曲(你有把它編譯成php)。通過捲曲,您可以執行POST和HEAD請求,並設置各種標題。

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://google.com'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$html = curl_exec($ch); 

?> 
+0

任何這將被稱爲包裝實施... Ozzy正在尋找對於* raw * http。但是說了這個......關於http沒有任何原始的東西......取決於它從哪個角度看待它! – 2011-01-13 02:35:34

2

cURL比實現客戶端HTTP更容易。你所要做的就是設置一些選項,cURL處理其餘的部分。

$curl = curl_init($URL); 
curl_setopt_array($curl, 
    array(
     CURLOPT_USERAGENT => 'Mozilla/5.0 (PLAYSTATION 3; 2.00)', 
     CURLOPT_HTTPAUTH => CURLAUTH_ANY, 
     CURLOPT_USERPWD => 'User:Password', 
     CURLOPT_RETURNTRANSFER => True, 
     CURLOPT_FOLLOWLOCATION => True 
     // set CURLOPT_HEADER to True if you want headers in the result. 
    ) 
); 
$result = curl_exec($curl); 

如果您需要設置捲曲不支持標題,可以使用CURLOPT_HTTPHEADER選項,通過附加頭陣列。如果您需要解析標題,請將CURLOPT_HEADERFUNCTION設置爲回調。請閱讀curl_setopt的文檔以獲取更多選項。