ip
как программно определить диапазон ip адресов, принадлежащий конкретной стране?
Цитата:
Originally posted by Fevzi
как программно определить диапазон ip адресов, принадлежащий конкретной стране?
как программно определить диапазон ip адресов, принадлежащий конкретной стране?
Бежишь, например, сюда , конвертируешь всё это в удобный для себя вид и пользуешься.
От себя добавлю, что наибольший интерес из всего этого представляет собой последний файл:
http://www.completewhois.com/statistics/data/ips-bycountry/rirstats/country_rirdata-dnsipl-all.txt
Вот, даже нашинковал эти файлы в MySQL по-быстренькому.
Цитата:
Originally posted by mfender
Вот, даже нашинковал эти файлы в MySQL по-быстренькому.
Вот, даже нашинковал эти файлы в MySQL по-быстренькому.
Куль, пасиб. Хотел сам это сделать (файл валяеться), но руки всё не доходили.
Цитата:
Originally posted by shaelf
Куль, пасиб. Хотел сам это сделать (файл валяеться), но руки всё не доходили.
Куль, пасиб. Хотел сам это сделать (файл валяеться), но руки всё не доходили.
Могу класс подкинуть, сваянный на скорую руку.
Код:
class IPC
{
private $DB;
private $countryArray;
const FILES_DIR = "http://www.completewhois.com/statistics/data/ips-bycountry/rirstats/";
const COUNTRYS_FILE = "1ST-READ-THIS.txt";
const SUFFIX_FILE = "-netrange.txt";
public function __construct(&$db){
$this->DB = $db;
$this->createTables();
}
public function readAllFiles(){
foreach($this->getCountryCodes() as $row){
$ipf = file(IP::FILES_DIR.$row.IP::SUFFIX_FILE);
foreach($ipf as $str){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+(\d+\.\d+\.\d+\.\d+)/", $str, $arr, PREG_SET_ORDER);
if(sizeof($arr)){
$this->replaceIPAddresses(ip2long($arr[0][1]), ip2long($arr[0][2]), $row);
}
}
}
}
private function getCountryCodes(){
return $this->DB->getCol("SELECT cc FROM ip_countrys", "cc");
}
private function replaceIPAddresses($addressFirst, $addressLast, $countryCode){
$query = "REPLACE ip_addresses
SET
ip_first = '$addressFirst',
ip_last = '$addressLast',
cc = '$countryCode'";
$this->DB->Query($query);
}
public function readFirst($file){
$arr = file($file);
foreach($arr as $row){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+([A-Za-z]+)\s+\-\s+(\w+)/", $row, $pstr, PREG_SET_ORDER);
if(sizeof($pstr)){
$this->replaceCountryCode($pstr[0]);
}
}
}
private function replaceCountryCode($arr){
$query = "REPLACE ip_countrys
SET
cc = '{$arr[2]}',
name = '{$arr[3]}',
a_dns = '{$arr[1]}'
";
$this->DB->Query($query);
}
private function createTables(){
$sql = "
CREATE TABLE IF NOT EXISTS `ip_addresses` (
`ip_first` bigint(20) NOT NULL default '0',
`ip_last` bigint(20) NOT NULL default '0',
`cc` char(2) NOT NULL default '',
KEY `ip_last` (`ip_last`),
KEY `cc` (`cc`),
KEY `ip_first` (`ip_first`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ";
$this->DB->Query($query);
$sql ="
CREATE TABLE IF NOT EXISTS `ip_countrys` (
`cc` char(2) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`a_dns` varchar(15) NOT NULL default '',
PRIMARY KEY (`cc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
";
$this->DB->Query($query);
}
}
$ip = new IPC($DBC);
$ip->readFirst(FIRST_FILE);
$ip->readAllFiles();
{
private $DB;
private $countryArray;
const FILES_DIR = "http://www.completewhois.com/statistics/data/ips-bycountry/rirstats/";
const COUNTRYS_FILE = "1ST-READ-THIS.txt";
const SUFFIX_FILE = "-netrange.txt";
public function __construct(&$db){
$this->DB = $db;
$this->createTables();
}
public function readAllFiles(){
foreach($this->getCountryCodes() as $row){
$ipf = file(IP::FILES_DIR.$row.IP::SUFFIX_FILE);
foreach($ipf as $str){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+(\d+\.\d+\.\d+\.\d+)/", $str, $arr, PREG_SET_ORDER);
if(sizeof($arr)){
$this->replaceIPAddresses(ip2long($arr[0][1]), ip2long($arr[0][2]), $row);
}
}
}
}
private function getCountryCodes(){
return $this->DB->getCol("SELECT cc FROM ip_countrys", "cc");
}
private function replaceIPAddresses($addressFirst, $addressLast, $countryCode){
$query = "REPLACE ip_addresses
SET
ip_first = '$addressFirst',
ip_last = '$addressLast',
cc = '$countryCode'";
$this->DB->Query($query);
}
public function readFirst($file){
$arr = file($file);
foreach($arr as $row){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+([A-Za-z]+)\s+\-\s+(\w+)/", $row, $pstr, PREG_SET_ORDER);
if(sizeof($pstr)){
$this->replaceCountryCode($pstr[0]);
}
}
}
private function replaceCountryCode($arr){
$query = "REPLACE ip_countrys
SET
cc = '{$arr[2]}',
name = '{$arr[3]}',
a_dns = '{$arr[1]}'
";
$this->DB->Query($query);
}
private function createTables(){
$sql = "
CREATE TABLE IF NOT EXISTS `ip_addresses` (
`ip_first` bigint(20) NOT NULL default '0',
`ip_last` bigint(20) NOT NULL default '0',
`cc` char(2) NOT NULL default '',
KEY `ip_last` (`ip_last`),
KEY `cc` (`cc`),
KEY `ip_first` (`ip_first`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ";
$this->DB->Query($query);
$sql ="
CREATE TABLE IF NOT EXISTS `ip_countrys` (
`cc` char(2) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`a_dns` varchar(15) NOT NULL default '',
PRIMARY KEY (`cc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
";
$this->DB->Query($query);
}
}
$ip = new IPC($DBC);
$ip->readFirst(FIRST_FILE);
$ip->readAllFiles();
Ну, что такое $DBC - надеюсь понятно. Варьируется взависимости от владельца :)
Спасибо. PHP5, а MySQL какой?
Цитата:
Originally posted by shaelf
Спасибо. PHP5, а MySQL какой?
Спасибо. PHP5, а MySQL какой?
MySQL - любой. У меня - 4.1.16