일하다가 DB에 ip주소 및 대역폭, 마스크 등을 전부다 분리해서 입력해야할 일이 생겨서
C#으로 간단하게 하나 만들어보았다
ip가 하나면 그냥 입력하겠는데
이런 ip리스트가 수십~ 수백개가 되면 분리하는것도, 입력하는것도 여간귀찮은 일이 아니므로...
-------------------------------------------------------------------------------------
문제는 다음과 같다
ip리스트를 다음과 같이 파일로 입력받으면
---test.txt----
111.222.333.0/24
111.223.0.0/16
222.333.444.0/24
등등
---test.txt----
다음과 같이 쿼리 리스트로 변환하는것이 바로 목표다
===result.txt===
insert into bldg_ip(xxx,yyy,zzz) values('xxx',yyy,'zzz');
insert into bldg_ip(xxx,yyy,zzz) values('xxx',yyy,'zzz');
insert into bldg_ip(xxx,yyy,zzz) values('xxx',yyy,'zzz');
등등
각각의 컬럼은 ip a~d클래스, 마스크, 호스트의 범위 등등
===result.txt===
집이라 코드가 없어서 ...귀찮기도하고...반복문없이 하나의 ip만 가지고 설명하겠슴...
ip클래스를 사용할줄아는사람은 볼 필요가 없음...
c#에서도 ip타입을 사용하면 알아서 분리도해주고 다 해주기 때문에..ㅡ,.ㅡ..
하지만 난 그런것도 모르고...걍 바로바로 코딩하니까 문자열로 다했다
예를 들기 위한 ip는 '156.147.0.0/16' 이다
요 아이피는 마스크가 16이므로 네트워크 아이디부가 156.147 까지, 그리고 호스트가 0.0 ~ 255.255 이다
다시 설명하면 156.147.0.0을 2진수로 각각 표현하면
128+16+8+4 . 128+16+2+1 . 0. 0 이니까
비트로 표현하면
10011100 . 10010011 . 00000000 . 00000000 이다
그리고 마스크는 다음과 같다.
11111111 . 11111111 . 00000000 . 00000000 (/16 이니까 앞에서부터 16개만 1)
이렇게 되면 마스크가 1인 부분을 뺀 나머지 부분(= 마스크가 0인부분 = 하위 16비트)으로
호스트를 결정하는데
각각을 써보면
10011100 . 10010011 . 00000000 . 00000000 156.147.0.0 -> network id
10011100 . 10010011 . 00000000 . 00000001 156.147.0.1
10011100 . 10010011 . 00000000 . 00000010 156.147.0.2
10011100 . 10010011 . 00000000 . 00000011 156.147.0.3
10011100 . 10010011 . 00000000 . 00000100 156.147.0.4
10011100 . 10010011 . 11111111 . 11111111 156.147.255.255 -> broadcasting
등등등
으로 이루어진다
참고로 호스트 대역에서 0은 네트워크id, 255는 서브넷브로드캐스팅 주소로 할당되어있어서
실제 호스트로는 쓰지 않는다.
고로 마스크가 16이면
2^16 - 2 (65534개) 만큼의 호스트 갯수가 생긴다.
이 대역에서 서브네팅을 어떻게 하느냐에 따라 호스트 갯수는 달라진다...
그건 뭐...네트워크맹근 사람이 알아서 하고...
어쨋든 ip를 비트로 분리한다
string으로 ip를 입력받고 token함수로 . 과 / 을 분리하면
쉽게 156 147 0 0 16 을 분리할 수 있다
byte[]를 사용하여 분리하면
이차원 배열로 byte타입이 5개 생길것이다. a,b,c,d클래스+마스크
그러면 요 바이트 타입을 2진수로 나누는 함수로 비트화한다
함수는 알아서 작성하시길...
2로 나눠서 나머지쓰고 또 나누고 ...뭐 중학교때 배우는거...
그렇게 해서 각각을 나타내면
10011100 . 10010011 . 00000000 . 00000000 으로 되고
마스크는
string 타입 변수를 새로 생성해서 16만큼 루프 돌려서 앞에 1 쓰고 나머지 0으로 채워버리면
11111111 11111111 00000000 00000000으로 쉽게 나타낼 수 있다
그러면 이제 네트워크 아뒤는 바로 저 위에 ip를 쓰면 되고(156.147.0.0)
대역의 첫번째 호스트 주소는 저 아이피에 1만 더하면된다(156.147.0.1)
대역의 서브넷브로드캐스팅주소는 마스크에서 0인 부분만 ip에서 1로 바꾸면되고(156.147.255.255)
대역의 마지막 호스트 주소는 서브넷브로드캐스팅주소에서 1만 빼면된다(156.147.255.254)
string으로 다 하니까 분리도 쉽고, 비트화해서 연산하면 계산하기도 쉽고..해서 편했다
물론 ipv4가 32비트로 고정되어있어서 쉽기도 했고...
한가지 헷갈릴수있는 부분은
ip의 a클래스가 128보다 작은 경우 맨 앞에 0 이 생기기 때문에
일반 byte나 uint형으로 사용하면 이상하게 연산되는 경우가 있다...
스트링으로 하면 그냥 0으로 채워넣으면되기 때문에 편하기도하다...
나중에 다시 uint형으로 바꿀때는(int로 하면 음수로 나오는 거시기가 있음...)
각 비트별로 정수 곱해버리면 간단하다
---------------------------------------------------------
사실 ip타입 사용하고 그냥 uint형으로도 연산하면
금방 구할수있겠지만...
예전에 서브네팅이나 VLSM 할때 비트로 다 변환해서 연습하고해서
한번 그런식으로 만들어보고싶었다..ㅡ,ㅡ...
왠지 재미있어........








이 글에는 트랙백을 보낼 수 없습니다
2009/09/01 07:32



dhappy
2009/09/01 01:46
computer/etc.


최근 글
더~러운 세상~

