Pcap 라이브러리로 잡은 수신지, 발신지 아이피를
MySQL디비에 넣을려고 합니다..
C기반이며,, 방법아시는분 가르쳐 주세요~~~*
디비 생성시 어떤 자료형인지..등등
구체적으로.. 가르쳐 주세요~~
제가 공부하다가 찾게됐습니다.
char src_ip[1000]; char dst_ip[1000]; sprintf(src_ip,"%d.%d.%d.%d",src_ipadd[0],src_ipadd[1],src_ipadd[2],src_ipadd[3]); sprintf(dst_ip,"%d.%d.%d.%d",dst_ipadd[0],dst_ipadd[1],dst_ipadd[2],dst_ipadd[3]);
sprintf를 사용했습니다.
소스 아이피와 도착지 주소를 각각 분리한후 그걸 다시 정수형으로 넣은후 그 출력 내용을 반환하여 src_ip, dst_ip에 그 값들을 넣었습니다.
sprintf(src_ip,"%d.%d.%d.%d",src_ipadd[0],src_ipadd[1],src_ipadd[2],src_ipadd[3]); sprintf(dst_ip,"%d.%d.%d.%d",dst_ipadd[0],dst_ipadd[1],dst_ipadd[2],dst_ipadd[3]);
참고로 char *inet_ntoa(struct in_addr in); 이 놈을 참고 해 보세요...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h> do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
그렇게 string 형태로 바꾸면 나중에 sort 하거나 검색시 많은양의 데이타가 있을경우 속도저하 요인이 될수 있습니다.
그냥 LONG 값으로 DB에 넣으시고.빼올때는 cast 해서 일반적인 ip 스트링 형태로 보시는게 더 좋습니다..
================================= :: how about a cup of tea ? :: =================================
struct ip *iph; //IP Header Struct Pointer//
u_char *src_ipadd; //Source IP Address u_char *dst_ipadd; //Distination IP Address
src_ipadd = ((u_char *)&(iph -> ip_src)); dst_ipadd = ((u_char *)&(iph -> ip_dst));
-----------------------------------------------------------------------------------
char src_ip[1000]; char dst_ip[1000]; sprintf(src_ip,"%d.%d.%d.%d",src_ipadd[0],src_ipadd[1],src_ipadd[2],src_ipadd[3]); sprintf(dst_ip,"%d.%d.%d.%d",dst_ipadd[0],dst_ipadd[1],dst_ipadd[2],dst_ipadd[3]); sprintf(buff,"insert into log values" "('%s','%s','%s','%s','%d','%d','%s')", rule_mapping[rule_number].Attack_Type, rule_mapping[rule_number].Name, src_ip, dst_ip, src_port, dst_port, ctime(&t)); mysql_query(&mysql,buff);
이렇게 했습니다.
롱이면 숫자로 말입니까?
아이피는 203 230 xx xxx 4개 각각 입력이 들어오지 않나요?
이걸 어떻게 롱값으로 그냥 D/B에 넣죠?
그래서 저걸 출력할때 루프문을 써서 4개 합쳐서 출력하곤 했습니다.
넣는다면 어떤식으로 롱형으로 넣는지..?
서지훈님 말씀대로..
char *inet_ntoa(struct in_addr in);
이놈을 한번 조사해보도록 하겠습니다....
[/code]
sprintf(src_ip,"%d.%d.%d.%d",src_ipadd[0],src_ipadd[1],src_ipadd[2],src_ipadd[3]); sprintf(dst_ip,"%d.%d.%d.%d",dst_ipadd[0],dst_ipadd[1],dst_ipadd[2],dst_ipadd[3]); sprintf(buff,"insert into log values" "('%s','%s','%s','%s','%d','%d','%s')", rule_mapping[rule_number].Attack_Type, rule_mapping[rule_number].Name, src_ip, dst_ip, src_port, dst_port, ctime(&t)); mysql_query(&mysql,buff); -------------------------------------------------------------------------------------- 이부분이 D/B 에 쓰는부분. 이렇게 했습니다. 롱이면 숫자로 말입니까? 아이피는 203 230 xx xxx 4개 각각 입력이 들어오지 않나요? 이걸 어떻게 롱값으로 그냥 D/B에 넣죠?
sprintf(src_ip,"%d.%d.%d.%d",src_ipadd[0],src_ipadd[1],src_ipadd[2],src_ipadd[3]); sprintf(dst_ip,"%d.%d.%d.%d",dst_ipadd[0],dst_ipadd[1],dst_ipadd[2],dst_ipadd[3]); sprintf(buff,"insert into log values" "('%s','%s','%s','%s','%d','%d','%s')", rule_mapping[rule_number].Attack_Type, rule_mapping[rule_number].Name, src_ip, dst_ip, src_port, dst_port, ctime(&t)); mysql_query(&mysql,buff);
IP라는 것이 xxx.xxx.xxx.xxx로 이루어져 있는데, 각 자리는 8비트니까 결국 32비트, 즉 4byte, 다시 말해 long type으로 표현이 된다는 말이죠 :lol:
src_ipadd에 들어 있는 값은 원래 lont type값을 집어 넣은 건데 다시 long type으로 변경하자만,
unsigned long* org_ipaddr; org_ipaddr=(unsigned long)src_ipadd;
정도되겠지요. 그냥 이해하자고 적은 부분입니다.
long타입으로 저장했다가 필요할때 마다 변환해서 사용하던지, 처음부터 string형태로 사용하던지.... 용도에 따라 다르겠죠?
long 형으로 넣는다는게,, 이런식으로 23923081220
넣는다는 소리입니까?
근데 u_long 범위가,,
0 - 4294967295 이거인데
초과되지 않나요?
그리구,, 저희 로그디비 만드는데 쓰거든여,, 로그디비면,,
사용자들이 보기쉽게 만들어야 되지 않을까요?
그래서 번거롭게라도 Pcap으로 받은 아이피 정보를 따로 4개 불러서 캐릭터
형으로 넣었습니다..
윗분이 말씀하신 것처럼....
IP Address 는 4 bytes 입니다.
그럼, sizeof()로 보셔서 4 bytes 이사의 길이를 같는 데이터 형은 다 IP 를 넣을 수 있습니다.
특히, DB에 넣는다면 Sorting 등에서 아주 효율적이죠. (물론 디스크 공간도 절약되고요)
물론 IP String -> 숫자로 숫자 -> IP String 으로 변환하는 함수를 사용하셔야 겠죠.
문자열에서 숫자로 바꿔주는 함수는...
바꾸고자 하는 숫자가 정수일때.. atoi() 함수를..
바꾸고자 하는 숫자가 Long형 정수일때.. atol() 함수를 사용하시면 될꺼 같군요 8)
>> http://ragnarok.co.kr <<
라그온+ㅁ+ 댄서는 아직 죽지 않았다!! =-=-=-=-=-=-=-=-=-=-=-
long 형으로 넣는다는게,, 이런식으로 23923081220 넣는다는 소리입니까? 근데 u_long 범위가,, 0 - 4294967295 이거인데 초과되지 않나요?
239.230.81.220
==> 239 : EF 230 : E6 81 : 51 220 : DC
EF E6 51 DC 를 나열하고 한개의 숫자로 읽으면
4024848860(10)
그리구,, 저희 로그디비 만드는데 쓰거든여,, 로그디비면,, 사용자들이 보기쉽게 만들어야 되지 않을까요?
용도에 따라 다르겠지만, 수시로 볼것이 아니라면 그냥 숫자로
저장한 변환해서 출력하는 것이 좋겠군요. 어디까지나 제 생각입니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
제가 공부하다가 찾게됐습니다.[code:1]char src_i
제가 공부하다가 찾게됐습니다.
sprintf를 사용했습니다.
소스 아이피와 도착지 주소를 각각 분리한후 그걸 다시 정수형으로 넣은후 그 출력 내용을 반환하여 src_ip, dst_ip에 그 값들을 넣었습니다.
[quote="신호철"]char src_ip[1000]; char d
어떻게 위와 같은 코드가 나오는지 이 부분 소스라도 한 번 보고 싶군요...-_-ㅋ
정말로 보기 드문 소스 같아서...
좀... 많이 비효율적인거 같군요...
참고로
char *inet_ntoa(struct in_addr in);
이 놈을 참고 해 보세요...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
그렇게 string 형태로 바꾸면 나중에 sort 하거나 검색시 많은양의
그렇게 string 형태로 바꾸면 나중에 sort 하거나 검색시 많은양의 데이타가 있을경우 속도저하 요인이 될수 있습니다.
그냥 LONG 값으로 DB에 넣으시고.빼올때는 cast 해서 일반적인 ip 스트링 형태로 보시는게 더 좋습니다..
=================================
:: how about a cup of tea ? ::
=================================
비효율적인가요? 저는 이렇게 했습니다..
이렇게 구조체 변수로 iph를 선언한후에...
-------------------------------------------------------------------------------
위에껀 헤더파일에 선언.
차례로 소스아이피와 도착지 아이피를 뽑아내어 변수에 저장합니다.
-----------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
이부분이 D/B 에 쓰는부분.
이렇게 했습니다.
롱이면 숫자로 말입니까?
아이피는 203 230 xx xxx 4개 각각 입력이 들어오지 않나요?
이걸 어떻게 롱값으로 그냥 D/B에 넣죠?
그래서 저걸 출력할때 루프문을 써서 4개 합쳐서 출력하곤 했습니다.
넣는다면 어떤식으로 롱형으로 넣는지..?
서지훈님 말씀대로..
char *inet_ntoa(struct in_addr in);
이놈을 한번 조사해보도록 하겠습니다....
[/code]
Re: 비효율적인가요? 저는 이렇게 했습니다..
IP라는 것이 xxx.xxx.xxx.xxx로 이루어져 있는데, 각 자리는 8비트니까
결국 32비트, 즉 4byte, 다시 말해 long type으로 표현이 된다는 말이죠 :lol:
src_ipadd에 들어 있는 값은 원래 lont type값을 집어 넣은 건데 다시 long
type으로 변경하자만,
unsigned long* org_ipaddr;
org_ipaddr=(unsigned long)src_ipadd;
정도되겠지요. 그냥 이해하자고 적은 부분입니다.
long타입으로 저장했다가 필요할때 마다 변환해서 사용하던지,
처음부터 string형태로 사용하던지.... 용도에 따라 다르겠죠?
근데,, 롱 형으로 넣는다는게,,
long 형으로 넣는다는게,, 이런식으로
23923081220
넣는다는 소리입니까?
근데 u_long 범위가,,
0 - 4294967295 이거인데
초과되지 않나요?
그리구,, 저희 로그디비 만드는데 쓰거든여,, 로그디비면,,
사용자들이 보기쉽게 만들어야 되지 않을까요?
그래서 번거롭게라도 Pcap으로 받은 아이피 정보를 따로 4개 불러서 캐릭터
형으로 넣었습니다..
윗분이 말씀하신 것처럼....IP Address 는 4 bytes
윗분이 말씀하신 것처럼....
IP Address 는 4 bytes 입니다.
그럼, sizeof()로 보셔서 4 bytes 이사의 길이를 같는 데이터 형은 다 IP 를 넣을 수 있습니다.
특히, DB에 넣는다면 Sorting 등에서 아주 효율적이죠.
(물론 디스크 공간도 절약되고요)
물론 IP String -> 숫자로
숫자 -> IP String 으로 변환하는 함수를 사용하셔야 겠죠.
흠..
문자열에서 숫자로 바꿔주는 함수는...
바꾸고자 하는 숫자가 정수일때.. atoi() 함수를..
바꾸고자 하는 숫자가 Long형 정수일때.. atol() 함수를 사용하시면 될꺼 같군요 8)
>> http://ragnarok.co.kr <<
라그온+ㅁ+ 댄서는 아직 죽지 않았다!!
=-=-=-=-=-=-=-=-=-=-=-
Re: 근데,, 롱 형으로 넣는다는게,,
239.230.81.220
==> 239 : EF
230 : E6
81 : 51
220 : DC
EF E6 51 DC 를 나열하고 한개의 숫자로 읽으면
4024848860(10)
용도에 따라 다르겠지만, 수시로 볼것이 아니라면 그냥 숫자로
저장한 변환해서 출력하는 것이 좋겠군요. 어디까지나 제 생각입니다.
댓글 달기