2016-11-23 15 views
0

사람은 나는 그런 192.168.1.1/24 같은 CIDR와 IP 주소를 가지고 그 범위 등 192.168.1.1, 192.168.1.2, 192.168.1.3 ...모든 IP의 서브넷에서 (C)

I의 내부의 모든 IP 주소를 반환 할 수있는 방법의 좋은 예를 가지고 있는가 '그것이, unsigned long의 배열에있는 한 나는 그것의 벌금을 이해할 수

/* Pseudocode */ 
while(currnetip <= finalip) { 
    print(currnetip); 
    currnetip++; 
} 

같은 char 또는 뭔가를 반환 괜찮 해요.

나에게 도움이된다고 생각되면 자유롭게 게시물에 대한 의견을 말하십시오.

편집 : 아마도 언급할만한 가치가 있습니다. 브로드 캐스트 주소를 계산하는 많은 것들을 발견했습니다. 모든 기능을 함께 연결하는 방법을 모르겠습니다.

+0

IPv4 및 IPv6는 현재 두 가지 IP 만 있습니다.나는 IP 주소가 아니라 IP (Internet Protocols)를 의미한다고 생각합니다. –

+0

@ 론 Maupin 예 thats 내가 무슨 뜻인지. 명확성을 위해 편집 됨 –

답변

2

먼저 uint32_t (<stdint.h>에 정의 됨)에 IPv4 주소를 입력하고 점으로 구분 된 10 진수 표기법의 가장 왼쪽 옥텟을 가장 중요한 비트에 넣습니다. 예를 들어,

uint32_t ipv4_pack(const uint8_t octet1, 
        const uint8_t octet2, 
        const uint8_t octet3, 
        const uint8_t octet4) 
{ 
    return (((uint32_t)octet1) << 24) 
     | (((uint32_t)octet2) << 16) 
     | (((uint32_t)octet3) << 8) 
     | ((uint32_t)octet4); 
} 

및 역

, 128.64.32.16 같은 주소 0x80402010 (128 == 80 16 64 ==로 포장된다

unsigned char *ipv4_unpack(unsigned char *addr, const uint32_t packed) 
{ 
    addr[3] = (uint8_t)(packed); 
    addr[2] = (uint8_t)(packed >> 8); 
    addr[1] = (uint8_t)(packed >> 16); 
    addr[0] = (uint8_t)(packed >> 24); 
    return addr; 
} 

40 16 32 == 20 및 16 == 1).


설정할 수도 많은 최상위 비트 바이너리 마스크로 (1 ~ 32)을 CIDR 프리픽스 크기를 변환해야

:

uint32_t ipv4_mask(const int prefix_size) 
{ 
    if (prefix_size > 31) 
     return (uint32_t)0xFFFFFFFFU; 
    else 
    if (prefix_size > 0) 
     return ((uint32_t)0xFFFFFFFFU) << (32 - prefix_size); 
    else 
     return (uint32_t)0U; 
} 

프리픽스 이진 11111111111111111111111100000000의 마스크 (24 개)에 상당, 및 0xFFFFFF00 (16 진수).

접두어 28은 2 진수에서는 11111111111111111111111111110000의 마스크에 해당하고 16 진수에서는 0xFFFFFFF0입니다. 어드레스 addr1.addr2.addr3.addr4/prefix 들어

, 범위 (상기 범위의 통상적 게이트웨이 어드레스)의 첫 번째 어드레스

uint32_t first = ipv4_pack(addr1, addr2, addr3, addr4) & ipv4_mask(prefix); 

마지막 주소 (상기 범위에 대해 일반적으로 브로드 캐스트 주소)

uint32_t last = ipv4_pack(addr1, addr2, addr3, addr4) | (~ipv4_mask(prefix)); 
이다

first <= last 모든 경우에 first에서 last까지를 반복하고 ipv4_unpack()을 호출하여 값을 점으로 구분 된 10 진수 표기법으로 압축하면 모든 IPv4 주소가 생성됩니다. 범위.


동일한 작업이 IPv6에는 작동하지만 uint128_t 유형이 필요합니다. (더 작은 부호없는 정수형으로 에뮬레이션 될 수 있지만, 몇 가지 더 자세한 지침이 있지만 로직은 동일하게 유지됩니다.)