COMMENTS

  • james@rounter: Hey okay thx. :)
  • james@router: Does my mac adresse change if I upgrade my computer with some...
  • Firm: 这方面没接触过 8-O
  • ontogma: итак: восхитительно… Киев лучшие секс знакомства...
  • 一路阳光: 现在再看刚毕业时的简历肯定感觉有点心虚,当年要不是初生牛犊估 计也没有那份胆量写那样的简历了
  • licream: 我也离了。0 0。不过还没找上。郁闷哦
  • Firm: 公司面试都喜欢考链表 确实,俺上次也考这个了
  • bokit: 今天第一天开工,祝心想事成,顺顺利利 PS:恭喜博主,新的一年新的开始。

ioctl及getifaddrs读取IPV4,IPV6网卡信息

使用ioctl的SIOCGIFCONF可以读取所有网卡信息。ioctl调用后返回指向ifconf的结构链表,其中包含了指向ifreq的结构指针。ifconf及ifreq定义在net/if.h中。

《UNIX网络编程》中提供了get_ifi_info函数的实现方法,使用这种方式来获取网络信息。在LINUX下,这种方式不能获得IPV6的网卡信息。《UNIX网络编程》中有如下描述:

在支持IPV6的系统中,没有关于对SIOCGIFCONF请求是否返回IPV6地址的标准。我们给支持IPV6的新系统增加了一个case语句, 这是为了预防万一。问题在于ifreq中的联合把返回的地址定义成一个通用的16字节套接口地址结构,适合16字节的IPV4 socket_in结构,但对于24字节的IPV6 socket_in6结构太小了。如果返回IPV6地址,将可能破环现有的在每个ifreq结构中采用固定大小的套接口地址结构的代码。

经测试,在fedor6-2.6.18kernel中无法返回ipv6地址,事实上,返回的地址簇总是AF_INET,而并非AF_INET6。
这种方法的实现代码如下:

继续阅读