죄송합니다. 저도 착각을 한 것 같은데 처음 설명해 주신 것이
맞는 것 같습니다.
그런데 이해가 안되는 부분은,
INET_ATON('255.255.255.255') - INET_ATON('255.248.0.0')에서
왜 INET_ATON('255.248.0.0')을
빼는 것인지 그것이 무슨 의미인지 한번만 더 설명을
부탁드려요.
========================================================
의외로 간단한데 어렵게 설명했네요.
'시작주소' , '마지막주소' , '국가코드'
'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
===========================================================
>
>[산이]님이 남기신 글:
>
>>
>>[산이]님이 남기신 글:
>>
>>>
>>>[고석철]님이
남기신 글:
>>>
>>>>산이님,
>>>>제가 디비에 입력된 ntoa 아이피 자료가 45,500개 이고 새로
추가하려는 aton 자료가 90 여개 이므로 aton 자료만 ntoa로
변환하면 아주 간단할 것 같습니다. 이미 모듈도 ntoa 디비를
이용하는 것으로 되어 있어요.
>>>>반대의 방법을 설명해 주신 것 같습니다.
>>>>
>>>
>>>아 그런가요?
>>>
>>>ntoa 는 너무나 쉽죠? SQL 문 한방이면 끝나죠..
>>>
>>>mysql> UPDATE nuke_stats_country_ip_index SET
>>> > ipfrom = INET_NTOA(ipfrom),
>>> > ipto = INET_NTOA(ipto)
>>> > WHERE id_nation != 100
>>> >;
>>>
>>>
>>
>>INET_ATON(): // Address TO Number
>>INET_NTOA(); // Number TO Address
>>
>>number 형태로 DB 에 저장되어 있을 경우
>>
>>UPDATE table SET
>> ipto = INET_NTOA
>> ( ipfrom + INET_ATON('255.255.255.255') - ipto ),
>> ipfrom = INET_NTOA(ipfrom)
>>;
>>
>>*주)
>>계산순서상 ipto 을 먼저 update 해야함
>>
>>
>>
>>>>참고로, 제가 45천개의 ntoa 디비를 보내 드릴테니 좋은
작품을 한번 만들어 보시지요.
>>>>
>>>
>>>4만 5천개이면 하나의 레코드당 15 + 15 + 4 => 약 34 bytes
>>>이므로 45,000 * 33 = 약 1.5MB 정도 되겠군요. 맞나요?
>>>
>>>요즘 회사에서 FreeBSD 공부중이라서 시간이 거의 나질
않습니다...T.T
>>>
>>>>[산이]님이 남기신 글:
>>>>
>>>>>
>>>>>[고석철]님이
남기신 글:
>>>>>
>>>>>>친절히 답변해 주셔서 감사합니다. 저는 본시 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;
>>>>>>
>>>>>>}
>>>>>>
>>>>>>===============================================================
>>>>
>>>>========================================
>>>
>>>========================================
>>
>>========================================
>
>========================================
========================================
|