【linux】linux c判断IP地址类型及是否合法

描述

       在 Linux C 编程中,可以通过 inet_pton 函数来判断一个 IP 地址是 IPv4 还是 IPv6,同时验证其合法性。以下是一个完整的示例代码,既可以判断 IP 地址的类型(IPv4 或 IPv6),又可以验证其合法性。


示例代码

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

// 函数:判断 IP 地址类型并验证合法性
int check_ip(const char *ip) {
    struct in_addr ipv4_addr;
    struct in6_addr ipv6_addr;

    // 尝试解析为 IPv4 地址
    if (inet_pton(AF_INET, ip, &ipv4_addr) == 1) {
        return 4; // IPv4 地址合法
    }

    // 尝试解析为 IPv6 地址
    if (inet_pton(AF_INET6, ip, &ipv6_addr) == 1) {
        return 6; // IPv6 地址合法
    }

    // 如果都不是,则为无效地址
    return 0;
}

int main() {
    // 测试用的 IP 地址
    const char *test_ips[] = {
        "192.168.1.1",          // 合法 IPv4
        "255.255.255.255",      // 合法 IPv4
        "2001:db8::1",          // 合法 IPv6
        "::1",                  // 合法 IPv6
        "invalid_ip",           // 无效
        "256.256.256.256",      // 无效 IPv4
        "2001:db8:85a3::8a2e:370:7334", // 合法 IPv6
        "abcd::1234::5678"      // 无效 IPv6
    };

    // 遍历测试 IP 地址并判断类型和合法性
    for (int i = 0; i < sizeof(test_ips) / sizeof(test_ips[0]); i++) {
        int result = check_ip(test_ips[i]);
        if (result == 4) {
            printf("IP 地址 %s 是合法的 IPv4 地址。\n", test_ips[i]);
        } else if (result == 6) {
            printf("IP 地址 %s 是合法的 IPv6 地址。\n", test_ips[i]);
        } else {
            printf("IP 地址 %s 是无效的 IP 地址。\n", test_ips[i]);
        }
    }

    return 0;
}

代码说明

  1. inet_pton 函数

    • inet_pton(AF_INET, ip, &ipv4_addr):尝试将字符串解析为 IPv4 地址。如果返回值为 1,表示解析成功且合法。
    • inet_pton(AF_INET6, ip, &ipv6_addr):尝试将字符串解析为 IPv6 地址。如果返回值为 1,表示解析成功且合法。
    • 如果返回值为 0,表示地址格式无效。
    • 如果返回值为 -1,表示出错(例如传入了无效的地址族)。
  2. 返回值

    • 返回 4 表示合法的 IPv4 地址。
    • 返回 6 表示合法的 IPv6 地址。
    • 返回 0 表示无效的 IP 地址。
  3. 测试用例

    • 包含合法的 IPv4 和 IPv6 地址,以及无效的地址。

编译和运行

使用以下命令编译和运行代码:

gcc -o ip_check ip_check.c
./ip_check

示例输出

IP 地址 192.168.1.1 是合法的 IPv4 地址。
IP 地址 255.255.255.255 是合法的 IPv4 地址。
IP 地址 2001:db8::1 是合法的 IPv6 地址。
IP 地址 ::1 是合法的 IPv6 地址。
IP 地址 invalid_ip 是无效的 IP 地址。
IP 地址 256.256.256.256 是无效的 IP 地址。
IP 地址 2001:db8:85a3::8a2e:370:7334 是合法的 IPv6 地址。
IP 地址 abcd::1234::5678 是无效的 IP 地址。

注意事项

  1. IPv4 和 IPv6 的格式

    • IPv4 地址格式为 x.x.x.x,每个 x 是 0 到 255 的数字。
    • IPv6 地址格式为 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,可以使用缩写(如 :: 表示连续的零)。
  2. 无效地址的处理

    • 如果输入的 IP 地址既不是合法的 IPv4,也不是合法的 IPv6,函数会返回 0
  3. 跨平台兼容性

    • inet_pton 是 POSIX 标准函数,适用于大多数类 Unix 系统(如 Linux 和 macOS)。

通过这种方式,你可以轻松判断一个 IP 地址是 IPv4、IPv6,还是无效的地址,同时验证其合法性。