2009-09-22 15 views
5

Desidero inviare un pacchetto http non elaborato a un server Web e ricevere la sua risposta, ma non posso trovare un modo per farlo. im inesperto con socket e ogni link trovo usi socket per inviare pacchetti udp. Qualsiasi aiuto sarebbe grande.PHP Come inviare pacchetto HTTP raw

+0

@Ozzy: nota - HTTP utilizza TCP (flussi) non UDP (pacchetti). –

+0

aa vedo THX :) – Ozzy

+0

Perché vuoi implementare HTTP? C'è una buona possibilità che CURL farà quello che vuoi in modo da non dover reinventare la ruota. – outis

risposta

6

Date un'occhiata a questo semplice esempio dal 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); 
} 
?> 

La connessione al server è stabilito con fsockpen. $out contiene la richiesta HTTP che viene quindi inviata con frwite. La risposta HTTP viene quindi letta con fgets.

+1

esattamente quello di cui avevo bisogno. Penso di dover ripensare il mio approccio allo spoofing del pacchetto tho: S – Ozzy

3

Se tutto quello che vogliamo fare è eseguire una richiesta GET e ricevere il corpo della risposta, la maggior parte delle funzioni di file supporta l'utilizzo di URL:

<?php 

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

?> 

<?php 

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

?> 

Per più di semplice diventa, uso ricciolo (avete compilarlo in php). Con l'arricciatura puoi fare le richieste POST e HEAD, così come impostare varie intestazioni.

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

$html = curl_exec($ch); 

?> 
+0

una di queste sarebbe chiamata implementazione del wrapper ... Ozzy stava guardando per * raw * http. Ma avendo detto che ... non c'è niente di grezzo su http ... dipende da quale punto di vista è stato visto! –

2

cURL è più semplice dell'implementazione del lato client HTTP. Tutto quello che devi fare è impostare alcune opzioni e CURL gestisce il resto.

$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); 

Se è necessario impostare un colpo di testa che cURL non supporta, utilizzare l'opzione CURLOPT_HTTPHEADER, passando un array di intestazioni aggiuntive. Impostare CURLOPT_HEADERFUNCTION su un callback se è necessario analizzare le intestazioni. Leggi i documenti per curl_setopt per ulteriori opzioni.