[C/C++] 서브넷팅

Alexandria·2024년 3월 4일
0

C lang

목록 보기
4/14
post-thumbnail

1. CIDR에서 Mask로 변환

입력이 CIDR일 때, Mask 형식으로 변환해본다.

CIDR와 Mask를 확인하면 CIDR가 28일때, Mask는 255.255.255.240이다.

코드를 컴파일 후 실행하여 결과를 비교해본다.

#include <stdio.h>

int main() {
	char result[16]     = {'\0' };
    unsigned long cidr  = 28;
    unsigned long mask  = (0xFFFFFFFF << (32 - cidr)) & 0xFFFFFFFF;
    snprintf(result, 16, "%lu.%lu.%lu.%lu", mask >> 24, (mask >> 16) & 0xFF, (mask >> 8) & 0xFF, mask & 0xFF);
    printf("%s\n", result); // 255.255.255.240

    return 0;
}

2. Mask에서 CIDR로 변환

입력이 Mask일 때, CIDR 형식으로 변환해본다.

CIDR와 Mask를 확인하면 Mask가 255.255.255.240일때, CIDR는 28이다.

코드를 컴파일 후 실행하여 결과를 비교해본다.

#include <stdio.h>
#include <arpa/inet.h>

int main() {
	unsigned int n, i = 0;
    const char *mask = "255.255.255.240";
    inet_pton(AF_INET, mask, &n);
    while (n > 0)
    {
        if (n & 1) i++;
        n = n >> 1;
    }
    printf("%d\n", i); // 28

    return 0;
}

3. 가용 IP

입력이 CIDR일 때, 사용가능한 IP 주소 수를 구해본다.

CIDR와 Mask를 확인하면 CIDR가 28일때, Hosts는 16이다.

코드를 컴파일 후 실행하여 결과를 비교해본다.

#include <stdio.h>
#include <arpa/inet.h>

int main() {
    double cidr = 28;
	printf("%.0f\n", pow(2, 32 - cidr)); // 16
    return 0;
}

입력이 IP 주소와 Mask일 때, 해당 네트워크가 속한 주소들을 구해본다.

입력 주소가 192.168.100.125/28이라면 192.168.100.112부터 192.168.100.127까지 사용할 수 있다.

#include <stdio.h>
#include <arpa/inet.h>

int main()
{
    struct in_addr ipaddr, network;
    int cnt = 0;
    inet_pton(AF_INET, "192.168.100.125", &ipaddr);
    inet_pton(AF_INET, "255.255.255.240", &network);

    unsigned long first = ntohl(ipaddr.s_addr & network.s_addr);
    unsigned long last  = ntohl(ipaddr.s_addr | ~(network.s_addr));

    for (unsigned long available = first; available <= last; ++available)
    {
        struct in_addr _;
        _.s_addr = htonl(available);
        cnt++;
        printf("The IP address is %s\n", inet_ntoa(_));
    }
    printf("Total Hosts : %d\n", cnt);

    return 0;
}
profile
IT 도서관

0개의 댓글

관련 채용 정보