当前位置: 首页 > article >正文

【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,还是无效的地址,同时验证其合法性。


http://www.kler.cn/a/518610.html

相关文章:

  • 为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️
  • 服务器中的流量主要是指什么?
  • 【阅读笔记】基于图像灰度梯度最大值累加的清晰度评价算子
  • AI导航工具我开源了利用node爬取了几百条数据
  • 【优选算法】10----无重复字符的最长子串
  • # [Unity]【游戏开发】 脚本生命周期与常见事件方法
  • Spring MVC中HandlerInterceptor的作用及应用场景
  • CVE-2025-0411 7-zip 漏洞复现
  • 防抖与节流:优化高频事件的两种利器
  • 「pandas」python pandas 初步、数据结构Series、DataFrame、MultiIndex
  • 【最小堆】【动态规划】力扣264. 丑数 II
  • 【Elasticsearch】eland是啥?
  • F#语言的图形用户界面
  • MarsCode青训营打卡Day11(2025年1月24日)|稀土掘金-373.字母出现次数的统计
  • 【OpenGL】OpenGL游戏案例(一)
  • Leetcode-两数之和
  • 【第六天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的贪心算法(持续更新)
  • flutter跨端UI框架简介
  • 简识JVM中的STW
  • 【二叉树】4. 判断一颗二叉树是否是平衡二叉树。5. 对称二叉树。6. 二叉树的构建及遍历 7. 二叉树的分层遍历 。
  • 使用 .NET Core 6.0 Web API 上传单个和多个文件
  • 12、MySQL锁相关知识
  • 分布式系统架构怎么搭建?
  • Flutter_学习记录_导航和其他
  • 小程序电商运营内容真实性增强策略及开源链动2+1模式AI智能名片S2B2C商城系统源码的应用探索
  • Linux之NetLink学习笔记