分类: 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