먼저 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
유형이 필요합니다. (더 작은 부호없는 정수형으로 에뮬레이션 될 수 있지만, 몇 가지 더 자세한 지침이 있지만 로직은 동일하게 유지됩니다.)
IPv4 및 IPv6는 현재 두 가지 IP 만 있습니다.나는 IP 주소가 아니라 IP (Internet Protocols)를 의미한다고 생각합니다. –
@ 론 Maupin 예 thats 내가 무슨 뜻인지. 명확성을 위해 편집 됨 –