我正在编写一个脚本,从whois.iana.org和区域whois返回一个IP的国家/地区。 没问题。
为了最大程度地减少查询,我希望能够从whois服务器存储ip范围,并将该范围的返回国家/地区存储在数据库中,以防万一来自同一个类的另一个ip地址我可以先在数据库中搜索,而不是向whois服务器发送请求。
这是我到目前为止所做的:
$ip = @$_GET['ip']."\r\n";
echo whois_get($ip);
//Open connection to whois server and fetch data
function whois_query($ip, $server) {
$fp = @fsockopen($server, 43, $errno, $errdesc);
if ($fp === false) {
error_report('Error opening the socket: ' . $errno . ' - ' . $errdesc . "\n");
return false;
}
if (fputs($fp, $ip) === false) {
error_report('Error writing to the socket' . "\n");
return false;
}
$answer = '';
while (!feof($fp)) {
$answer .= fread($fp, 8192);
}
fclose($fp);
return $answer;
};
function whois_get($ip) {
$string = whois_query($ip, 'whois.iana.org');
preg_match('/whois\..+/', $string, $whoisServer);
if (array_key_exists('0', $whoisServer)) {
if ($whoisServer[0] == "whois.arin.net") {
$ip = "n ".$ip;
}
$whoisInfo = whois_query($ip, $whoisServer[0]);
$country = getCountry($whoisInfo);
return "<b>Country:</b>".$country." \r\n";
} else {
return "UNKNOWN";
}
}
function getCountry($data){
preg_match('/ountry\:\s*[A-Z]{2}/', $data, $country);
$whoisCountry = $country[0];
$whoisCountry = preg_replace('/ountry\:/', '', $whoisCountry);
$whoisCountry = preg_replace('/\s+/', '', $whoisCountry);
return $whoisCountry;
}
任何人都可以告诉我如何为ipv4和ipv6地址执行此操作?我知道你不能在这里使用正则表达式。
如何解析从whois服务器返回的数据?
如何在本地数据库中搜索以确定IP属于哪个范围?