我想在php中更改套接字连接中每个请求的IP。(以防止主机在我发送大量请求时阻止我的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 (!@feof($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));
}
答案 0 :(得分:4)
您无法更改(欺骗)您发送的IP地址。但是,您可以使用SOCKS4/5之类的代理或带有PHP扩展cURL的HTTP代理。这将产生预期的效果。
但是,请注意,在尝试使用随机内容之前,您应首先收集有关proxy如何工作的更多知识(特别是使用您粘贴的代码,这不再是您想要用PHP5做的事情)
答案 1 :(得分:1)
当您使用TCP时,您无法更改发件人IP:如果您指定的地址不属于您,则任何答案都将路由到该IP,并且永远不会到达您的计算机。
因此,如果您不希望任何答案,则只能更改发件人IP。使用TCP,您必须在启动连接之前收到答案(SYN-ACK)。在任何情况下,大多数(如果不是任何ISP)都会阻止来自不属于您的IP的数据包。