Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121675
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-28 10:24
文章分类
文章存档

2014年(4)

2013年(36)

我的朋友

分类: LINUX

2013-12-20 13:00:41

原文地址:  ~zhouwei/tech/archives/000636.html


今天和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
阅读(6414) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~