2010-06-20 127 views
1

我想在php中修改套接字連接中的每個請求的IP地址(以防止主機在發送大量請求時阻止我的IP地址)Iam將我的代碼添加到下面php在套接字中更改請求的IP地址

function httpGet($url, $followRedirects=true) { 
global $final_url; 
$url_parsed = parse_url($url); 
if (empty($url_parsed['scheme'])) { 
    $url_parsed = parse_url('http://'.$url); 
} 
$final_url = $url_parsed; 

$port = $url_parsed["port"]; 
if (!$port) { 
    $port = 80; 
} 
$rtn['url']['port'] = $port; 

$path = $url_parsed["path"]; 
if (empty($path)) { 
    $path="/"; 
} 
if (!empty($url_parsed["query"])) { 
    $path .= "?".$url_parsed["query"]; 
} 
$rtn['url']['path'] = $path; 

$host = $url_parsed["host"]; 
$foundBody = false; 

$out = "GET $path HTTP/1.0\r\n"; 
$out .= "Host: $host\r\n"; 
$out .= "User-Agent:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n"; 
$out .= "Connection: Close\r\n\r\n"; 

if (!$fp = @fsockopen($host, $port, $errno, $errstr, 30)) { 
    $rtn['errornumber'] = $errno; 
    $rtn['errorstring'] = $errstr; 

} 
fwrite($fp, $out); 
while ([email protected]($fp)) { 

    $s = @fgets($fp, 128); 
    if ($s == "\r\n") { 
     $foundBody = true; 
     continue; 
    } 
    if ($foundBody) { 
     $body .= $s; 
    } else { 
     if (($followRedirects) && (stristr($s, "location:") != false)) { 
      $redirect = preg_replace("/location:/i", "", $s); 
      return httpGet(trim($redirect)); 
     } 
     $header .= $s; 
    } 
} 

fclose($fp); 

return(trim($body)); 

}

回答

4

您不能更改(惡搞)您發送的IP地址。但是,您可以使用代理(如SOCKS4/5)或HTTP代理(具有PHP擴展cURL)。這將導致預期的效果。

但是,請注意,您應該首先收集更多關於proxy如何使用隨機內容的知識(特別是使用您所粘貼的代碼,而不是您想要對PHP5執行的任何操作)。

+0

那麼什麼是這個功能的好替代? file_get_contents? 它支持重定向嗎? – 2010-06-20 21:04:23

+0

如上所述,如果您想使用代理,請使用cURL或PECL的HttpRequest – 2010-06-20 21:24:29

1

當你使用TCP,則不能更改發件人IP:如果指定了一個不屬於你一個地址,任何答案將被路由到該IP和永遠達不到你的電腦。

因此,如果您不希望有任何答案,您只能更改發件人IP。使用TCP,您必須在連接啓動前收到一個答案(SYN-ACK)。在任何情況下,來自不屬於您的IP的數據包將被大多數(如果不是任何ISP的話)阻止。