2009-09-02 19 views

risposta

15

Questo può essere fatto con arricciatura,, con il vantaggio di non avere altro traffico di rete oltre alla richiesta/risposta di arricciatura. Le richieste DNS sono fatte da arricciatura per ottenere gli indirizzi IP, che possono essere trovati nel rapporto dettagliato. Quindi:

  • Attiva CURLOPT_VERBOSE.
  • Diretto CURLOPT_STDERR a "php: // temp" risorsa wrapper stream.
  • Utilizzo di preg_match_all(), analizzare il contenuto di stringa della risorsa per gli indirizzi ip .
  • Gli indirizzi del server di risposta saranno nel sottoarray a chiave zero della serie di corrispondenze.
  • L'indirizzo del server consegna il contenuto (assumendo un richiesta riuscita) può essere recuperato con end(). Tutti gli indirizzi dei server che intervengono saranno anch'essi nel sottoarray , nell'ordine.

Demo:

$url = 'http://google.com'; 
$wrapper = fopen('php://temp', 'r+'); 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_STDERR, $wrapper); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch); 
curl_close($ch); 
$ips = get_curl_remote_ips($wrapper); 
fclose($wrapper); 

echo end($ips); // 208.69.36.231 

function get_curl_remote_ips($fp) 
{ 
    rewind($fp); 
    $str = fread($fp, 8192); 
    $regex = '/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/'; 
    if (preg_match_all($regex, $str, $matches)) { 
     return array_unique($matches[0]); // Array([0] => 74.125.45.100 [2] => 208.69.36.231) 
    } else { 
     return false; 
    } 
} 
0

AFAIK non è possibile forzare il server a inviare il proprio indirizzo IP nella risposta. Perché non cercare direttamente? (Controllare this question/answers for how to do that from php)

+0

il server è costituito da più istanze in esecuzione, quindi ho bisogno di sapere esattamente a quale server mi sono collegato e ho risposto per una particolare richiesta CURL. – Beier

3

Non penso che ci sia un modo per ottenere quell'indirizzo IP direttamente dall'arricciatura.
Ma qualcosa di simile potrebbe fare il trucco:

primo luogo, fare la richiesta ricciolo, e utilizzare curl_getinfo per ottenere l'URL "reale" che è stata scaricata - questo è perché il primo URL può reindirizzare ad un altro, e si desidera che quella finale:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$content = curl_exec($ch); 
$real_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
curl_close($ch); 
var_dump($real_url); // http://www.google.fr/ 

Quindi, utilizzare parse_url per estrarre la parte "host" da questo URL finale:

$host = parse_url($real_url, PHP_URL_HOST); 
var_dump($host);  // www.google.fr 

e, infine, utilizzare gethostbyname t o ottenere l'indirizzo IP che corrisponde a quello host:

$ip = gethostbyname($host); 
var_dump($ip);   // 209.85.227.99 

Beh ...
Questo è una soluzione ^^ Dovrebbe funzionare nella maggior parte dei casi, suppongo - anche se non sono sicuro che si sarebbe sempre ottenere il "corretto" risultato se v'è una sorta di Meccanismo di bilanciamento del carico ...

3
echo '<pre>'; 
print_r(gethostbynamel($host)); 
echo '</pre>'; 

che vi darà tutti gli indirizzi IP associati con il dato nome host.

-1

Ho usato questo

<? 
$hosts = gethostbynamel($hostname); 
if (is_array($hosts)) { 
    echo "Host ".$hostname." resolves to:<br><br>"; 
    foreach ($hosts as $ip) { 
      echo "IP: ".$ip."<br>"; 
    } 
} else { 
    echo "Host ".$hostname." is not tied to any IP."; 
} 
?> 

da qui: http://php.net/manual/en/function.gethostbynamel.php

3

penso che si dovrebbe essere in grado di ottenere l'indirizzo IP dal server con:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://stackoverflow.com"); 
curl_exec($ch); 
$ip = curl_getinfo($ch,CURLINFO_PRIMARY_IP); 
curl_close($ch); 
echo $ip; // 151.101.129.69