Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 IP 주소 유효성 검사 프로그램 작성하기

C 언어로 IP 주소 유효성 검사하기

이 글에서는 C 언어를 사용해 IP 주소(IPv4)의 유효성을 검사하는 방법을 알아보겠습니다. IPv4 주소는 점-십진법(dot-decimal notation)으로 표현되며, 0부터 255 범위의 네 개의 십진수가 세 개의 점(.)으로 구분된 형태입니다.

유효한 IP 주소의 예는 다음과 같습니다.

192.168.4.1

IP 주소 검증 절차

주어진 IP 주소가 유효한지 판별하려면 다음 단계를 순서대로 수행해야 합니다.

  • 점(".") 구분자를 기준으로 IP 주소 문자열을 토큰 단위로 분리합니다.
  • 분리된 각 부분 문자열에 숫자가 아닌 문자가 포함되어 있으면 실패(0)를 반환합니다.
  • 각 토큰의 숫자 값이 0~255 범위를 벗어나면 실패(0)를 반환합니다.
  • 정확히 세 개의 점과 네 개의 부분으로 구성되어 있을 때만 유효한 IP 주소로 판단합니다.

예제 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int validate_number(char *str) {
    while (*str) {
        if (!isdigit(*str)) { // 숫자가 아닌 문자가 있으면 실패
            return 0;
        }
        str++; // 다음 문자로 이동
    }
    return 1;
}

int validate_ip(char *ip) { // IP 유효 여부 확인
    int num, dots = 0;
    char *ptr;

    if (ip == NULL)
        return 0;

    ptr = strtok(ip, "."); // 점 구분자로 문자열 분리
    if (ptr == NULL)
        return 0;

    while (ptr) {
        if (!validate_number(ptr)) // 부분 문자열이 숫자만으로 구성되었는지 확인
            return 0;

        num = atoi(ptr); // 부분 문자열을 정수로 변환
        if (num >= 0 && num <= 255) {
            ptr = strtok(NULL, "."); // 문자열의 다음 부분 분리
            if (ptr != NULL)
                dots++; // 점 개수 증가
        } else {
            return 0;
        }
    }

    if (dots != 3) // 점의 개수가 3이 아니면 실패
        return 0;

    return 1;
}

int main() {
    char ip1[] = "192.168.4.1";
    char ip2[] = "172.16.253.1";
    char ip3[] = "192.800.100.1";
    char ip4[] = "125.512.100.abc";

    validate_ip(ip1) ? printf("Valid\n") : printf("Not valid\n");
    validate_ip(ip2) ? printf("Valid\n") : printf("Not valid\n");
    validate_ip(ip3) ? printf("Valid\n") : printf("Not valid\n");
    validate_ip(ip4) ? printf("Valid\n") : printf("Not valid\n");

    return 0;
}

실행 결과

Valid
Valid
Not valid
Not valid

결과 해설

ip1(192.168.4.1)과 ip2(172.16.253.1)는 모든 숫자가 0~255 범위 안에 있고 세 개의 점으로 올바르게 구분되어 있으므로 "Valid"가 출력됩니다. 반면 ip3(192.800.100.1)는 800이라는 값이 허용 범위인 255를 초과하고, ip4(125.512.100.abc)에는 숫자가 아닌 문자 'abc'가 포함되어 있으며 512 역시 범위를 벗어나므로 두 경우 모두 "Not valid"가 출력됩니다.

이처럼 문자열 분리 함수 strtok(), 문자 판별 함수 isdigit(), 그리고 문자열-정수 변환 함수 atoi()를 조합하면 별도의 라이브러리 없이도 손쉽게 IPv4 주소 검증 로직을 구현할 수 있습니다.