입력이 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;
}
입력이 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;
}
입력이 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;
}