산이님,
제가 디비에 입력된 ntoa 아이피 자료가 45,500개 이고 새로
추가하려는 aton 자료가 90 여개 이므로 aton 자료만 ntoa로
변환하면 아주 간단할 것 같습니다. 이미 모듈도 ntoa 디비를
이용하는 것으로 되어 있어요.
반대의 방법을 설명해 주신 것 같습니다.
참고로, 제가 45천개의 ntoa 디비를 보내 드릴테니 좋은 작품을
한번 만들어 보시지요.
[산이]님이 남기신 글:
>
>[고석철]님이 남기신 글:
>
>>친절히 답변해 주셔서 감사합니다. 저는 본시 PHP나 C 언어를
공부한 사람이 아니므로 클래스 같은 소스를 가져다가
가공해서 활용할 만큼의 지식은 없습니다. 현재 제가 갖고 있는
소스는,
>>
>>CREATE TABLE nuke_stats_country_ip_index (
>> ipfrom varchar(30) NOT NULL default '',
>> ipto varchar(30) NOT NULL default '',
>> id_nation smallint(6) NOT NULL default '0'
>>) TYPE=MyISAM;
>>
>>#
>># 테이블의 덤프 데이터 `nuke_stats_country_ip_index`
>>#
>>
>>INSERT INTO nuke_stats_country_ip_index VALUES ('0033996344', '0033996351',
192);
>>INSERT INTO nuke_stats_country_ip_index VALUES ('0050331648', '0083886079',
193);
>>
>>이며 약 45천개의 ip자료가 있습니다만, 한국은 제대로 분리가
되지 않고 있습니다. 그래서, 다음과 같은 산이님의 한국ip를
inet_ntoa() 형식으로 디비에 추가하려고 하는 것이지요. ★
이것을 어떻게 바꾸어야 하는지요?
>>
>>INSERT INTO nuke_stats_country_ip_index VALUES ('61.248.0.0', '255.248.0.0',
100);
>>INSERT INTO nuke_stats_country_ip_index VALUES ('129.254.0.0', '255.255.0.0',
100);
>>INSERT INTO nuke_stats_country_ip_index VALUES ('141.223.0.0', '255.255.0.0',
100);
>>INSERT INTO nuke_stats_country_ip_index VALUES ('147.6.0.0', '255.255.0.0',
100);
>>INSERT INTO nuke_stats_country_ip_index VALUES ('147.43.0.0', '255.255.0.0',
100);
>>INSERT INTO nuke_stats_country_ip_index VALUES ('147.46.0.0', '255.255.0.0',
100);
>>INSERT INTO nuke_stats_country_ip_index VALUES ('146.47.0.0', '255.255.0.0',
100);
>>
>>국별 분리 스크립트는 다음과 같습니다.
>>function GetCountryName($id_nation) {
>> global $prefix,$dbi;
>> $resultcn = sql_query("select countryname from
".$prefix."_stats_country_index where
id_nation='$id_nation'",$dbi);
>> list ($countryname) = sql_fetch_row($resultcn,$dbi);
>> return $countryname;
>>}
>>
>>--------------------------------------------------------
>
>의외로 간단한데 어렵게 설명했네요.
>
>'시작주소' , '마지막주소' , '국가코드'
>'0033996344' , '0033996351' , 192
>'2.6.190.56' , '2.6.190.63' , 192
>
>이것이 맞군요.
>
>약간의 수작이 필요하겠네요.
>
>'61.248.0.0', '255.248.0.0', 100
>
>이것은 네트워크주소하고
서브넷주소입니다.
>따라서
>
>시작주소는 당연이 61.248.0.0 이고
>마지막 주소는 61.255.255.255 입니다.
>
>좀 이해가 되나요?
>
>마지막 주소를 수식으로 표현하면 좀 복잡한데
>간단하게 머리로 계산할 수 있습니다.
>(AND 연산을 자주 접하면 금방 위의 주소가 나옵니다..)
>
>
>수식으로 표현하면(mysql)
>
>SELECT INET_NTOA
>(
> INET_ATON('61.248.0.0') +
> (
> INET_ATON('255.255.255.255') - INET_ATON('255.248.0.0')
> )
>); // 결과는 61.255.255.255 입니다.
>
>SELECT
>(
> INET_ATON('61.248.0.0') +
> (
> INET_ATON('255.255.255.255') - INET_ATON('255.248.0.0')
> )
>); // 결과는 1040187391
>
>10 자리 zerofill 로 맞추려면
>
>SELECT LPAD
>(
> INET_ATON('61.248.0.0') +
> (
> INET_ATON('255.255.255.255') - INET_ATON('255.248.0.0')
> )
>, 10, '0'); // 결과는 104018739
>
>따라서 이미 address 주소 형태로 DB 에 저장되어 있다면
>(먼저 address 형태로 저장하는 것이 좋겠군요.)
>
>------------------------------
>-- this file name 'aton.sql'
>--
>-- table name : nuke_stats_country_ip_index
>--
>-- 1. 먼저 마지막 주소를 수정
>--
>UPDATE nuke_stats_country_ip_index
> SET ipto = LPAD
> (
> INET_ATON(ipfrom) +
> (
> INET_ATON('255.255.255.255') - INET_ATON(ipto)
> ), 10, '0'
> )
> WHERE id_nation = 100
>;
>--
>-- 2. 시작주소 수정
>--
>UPDATE nuke_stats_country_ip_index
> SET ipfrom = LPAD(INET_ATON(ipfrom), 10, '0')
> WHERE id_nation = 100
>;
>-------------------------------
>
>shell> mysql -u username -p dbname < aton.sql
>
>기존의 디비를 백업하고 시도하세요.
>실수할수도 있으니깐요.
>
>good luck !!!
>
>>
>>위와는 좀 다른 소스입니다만, 자체의 ip 디비를 가지 않고
호주의 netgeo.caida.org 를 접속하여 정보를 가져오는 방식인데
한국도 apnic인 호주 접속으로 나오는 수가 많습니다.
>>
>>function wbd_getlatdata($ip) {
>>
>> $data = array("");
>>
>>$fp = fsockopen ("netgeo.caida.org", 80, $errno, $errstr,
30);
>>if (!$fp) {
>> echo "$errstr ($errno)<br>\n";
>>} else {
>> fputs ($fp, "GET /perl/netgeo.cgi?target=$ip HTTP/1.0\r\nHost:
netgeo.caida.org\r\n\r\n");
>> while (!feof($fp)) {
>> $packet = fgets ($fp,128);
>> array_push($data, $packet);
>> }
>> fclose ($fp);
>>}
>>
>> // make it an array
>>
>>return $data;
>>
>>}
>>
>>===============================================================
========================================
|