【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;
}
代码说明
-
inet_pton
函数:inet_pton(AF_INET, ip, &ipv4_addr)
:尝试将字符串解析为 IPv4 地址。如果返回值为1
,表示解析成功且合法。inet_pton(AF_INET6, ip, &ipv6_addr)
:尝试将字符串解析为 IPv6 地址。如果返回值为1
,表示解析成功且合法。- 如果返回值为
0
,表示地址格式无效。 - 如果返回值为
-1
,表示出错(例如传入了无效的地址族)。
-
返回值:
- 返回
4
表示合法的 IPv4 地址。 - 返回
6
表示合法的 IPv6 地址。 - 返回
0
表示无效的 IP 地址。
- 返回
-
测试用例:
- 包含合法的 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 地址。
注意事项
-
IPv4 和 IPv6 的格式:
- IPv4 地址格式为
x.x.x.x
,每个x
是 0 到 255 的数字。 - IPv6 地址格式为
xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
,可以使用缩写(如::
表示连续的零)。
- IPv4 地址格式为
-
无效地址的处理:
- 如果输入的 IP 地址既不是合法的 IPv4,也不是合法的 IPv6,函数会返回
0
。
- 如果输入的 IP 地址既不是合法的 IPv4,也不是合法的 IPv6,函数会返回
-
跨平台兼容性:
inet_pton
是 POSIX 标准函数,适用于大多数类 Unix 系统(如 Linux 和 macOS)。
通过这种方式,你可以轻松判断一个 IP 地址是 IPv4、IPv6,还是无效的地址,同时验证其合法性。