linux系统,eth0有ipv4及ipv6的地址,使用ioctl获取ipv6中Scope:Global的ipv6地址
时间: 2024-05-16 17:18:22 浏览: 359
linux下获取本机ip地址,ipv4和ipv6.pdf
可以使用如下代码获取eth0上Scope:Global的IPv6地址:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int fd;
struct ifreq ifr;
struct sockaddr_in6 *addr;
char *iface = "eth0";
fd = socket(AF_INET6, SOCK_DGRAM, 0);
if (fd < 0) {
perror("socket");
exit(1);
}
strncpy(ifr.ifr_name, iface, IFNAMSIZ);
if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
perror("ioctl");
exit(1);
}
addr = (struct sockaddr_in6 *)&ifr.ifr_addr;
if (addr->sin6_family != AF_INET6) {
fprintf(stderr, "Not an IPv6 address\n");
exit(1);
}
if (IN6_IS_ADDR_GLOBAL(&addr->sin6_addr)) {
char ip_str[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &addr->sin6_addr, ip_str, INET6_ADDRSTRLEN);
printf("%s\n", ip_str);
}
close(fd);
return 0;
}
```
该程序首先创建一个IPv6 socket,然后通过ioctl系统调用获取eth0的IPv6地址。如果该地址的Scope是Global,则打印出该地址。请注意,本程序只打印第一个Scope为Global的IPv6地址,如果有多个,只打印第一个。如果没有Scope为Global的IPv6地址,程序将不会输出任何内容。
阅读全文