区分ipv4 ipv6C代码
时间: 2024-06-19 09:03:44 浏览: 167
区分 IPv4 和 IPv6 的一种简单方法是使用地址族(Address Family)来判断。在 C 语言中,可以使用 `struct addrinfo` 结构体来表示地址信息,该结构体包含了地址族、IP 地址、端口号等信息。
以下是一个简单的示例代码,用于判断一个 IP 地址是 IPv4 还是 IPv6:
```c
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <hostname>\n", argv);
exit(EXIT_FAILURE);
}
struct addrinfo hints, *res;
int err;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; // 指定地址族为 IPv4 或 IPv6
hints.ai_socktype = SOCK_STREAM;
if ((err = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
exit(EXIT_FAILURE);
}
// 遍历结果,打印 IP 地址和地址族
struct addrinfo *p;
char ipstr[INET6_ADDRSTRLEN];
for (p = res; p != NULL; p = p->ai_next) {
void *addr;
char *ipver;
if (p->ai_family == AF_INET) { // IPv4 地址
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
ipver = "IPv4";
} else { // IPv6 地址
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
ipver = "IPv6";
}
// 将二进制地址转换为字符串格式
inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
printf("%s: %s\n", ipver, ipstr);
}
freeaddrinfo(res);
return 0;
}
```
在上述代码中,`hints.ai_family` 变量可以指定地址族为 `AF_INET`(IPv4)或 `AF_INET6`(IPv6),也可以设置为 `AF_UNSPEC`,表示不指定地址族,由系统自动决定。
通过遍历 `struct addrinfo` 结构体的链表,我们可以获得所有的 IP 地址和对应的地址族,并将二进制格式的 IP 地址转换为字符串格式,方便输出和显示。
阅读全文