分类: LINUX
2013-12-20 13:00:41
今天和lpguo一起看了有关在Linux下取得IPv6地址的问题,lpguo使用SIOCGIFADDR iotcl调用始终都无法获得IPv6地址,获取IPv4地址是没有问题的。我想在Linux可以使用ifconfig查看到IPv6地址,那获取 IPv6地址应该不是什么问题吧(这里多说一句,在嵌入式中广泛使用的busybox中带的ifconfig是不支持IPv6的,上次就为了这个问题找了 好久)。
于是将其源代码下载下来,其安装的软件包在net-tools中。找到了一个SIOCSIFADDR将IPv6设置的语句,于是lpguo就过去找 获取相关的语句了。不久,lpguo就又过来说只有IPv4的SIOCGIFADDR调用,还是没有IPv6的。然后打开vi和gdb调试,终于发现了 ifconfig获取IPv6地址的功能。原来它是读取/proc/net/if_inet6相应的域来打印的,具体的程序如下:
if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) {
while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",
addr6p[0], addr6p[1], addr6p[2], addr6p[3],
addr6p[4], addr6p[5], addr6p[6], addr6p[7],
&if_idx, &plen, &scope, &dad_status, devname) != EOF) {
if (!strcmp(devname, ptr->name)) {
sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",
addr6p[0], addr6p[1], addr6p[2], addr6p[3],
addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
inet6_aftype.input(1, addr6, (struct sockaddr *) &sap);
printf(_(" inet6 addr: %s/%d"),
inet6_aftype.sprint((struct sockaddr *) &sap, 1), plen);
printf(_(" Scope:"));
switch (scope) {
case 0:
printf(_("Global"));
break;
case IPV6_ADDR_LINKLOCAL:
printf(_("Link"));
break;
case IPV6_ADDR_SITELOCAL:
printf(_("Site"));
break;
case IPV6_ADDR_COMPATv4:
printf(_("Compat"));
break;
case IPV6_ADDR_LOOPBACK:
printf(_("Host"));
break;
default:
printf(_("Unknown"));
}
printf("\n");
}
}
fclose(f);
}
具体的函数在lib/interface.c中。另外,在/proc/net/文件夹中还有很多网络相关的数据,包括路由等,如果有需要可以从其中读取。 Posted by searun at March 21, 2006 02:45 PM