我能够通过以下代码获得给定接口的IPv4地址
int fd;
char ipv4[33];
char ifname[] = "eth0";
struct ifreq ifr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
snprintf(ipv4, 33, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
使用C获取给定接口的IPv6地址的最简单方法是什么?
*我正在张贴代码,我可以用来使它在下面。
int8_t find_device_ipv6(const char *ifname, char *ipv6, int8_t ipv6_size)
{
FILE *f;
int ret, scope, prefix;
unsigned char _ipv6[16];
char dname[IFNAMSIZ];
char address[INET6_ADDRSTRLEN];
char *scopestr;
f = fopen("/proc/net/if_inet6", "r");
if (f == NULL) {
return -1;
}
while (19 == fscanf(f,
" %2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx %*x %x %x %*x %s",
&_ipv6[0],
&_ipv6[1],
&_ipv6[2],
&_ipv6[3],
&_ipv6[4],
&_ipv6[5],
&_ipv6[6],
&_ipv6[7],
&_ipv6[8],
&_ipv6[9],
&_ipv6[10],
&_ipv6[11],
&_ipv6[12],
&_ipv6[13],
&_ipv6[14],
&_ipv6[15],
&prefix,
&scope,
dname)) {
if (strcmp(ifname, dname) != 0) {
continue;
}
if (inet_ntop(AF_INET6, _ipv6, address, sizeof(address)) == NULL) {
continue;
}
snprintf(ipv6, ipv6_size, "%s", address);
}
fclose(f);
return 0;
}
发布于 2016-02-23 10:20:48
我假设您的操作系统是Linux。
要了解它是如何完成的,请尝试strace ifconfig eth0
。
您可以看到它使用的是/proc/net/if_inet6
和一些ioctl,特别是SIOCGIFADDR
。
正如Ctx所评论的,您可能需要起义(3)
发布于 2016-02-23 10:38:28
最简单的方法肯定是使用getifaddrs(),以防glibc支持它。
如果不是,你最好不要知道.
https://stackoverflow.com/questions/35574497
复制相似问题