2013-12-23 15 views
8

我试图让IPv6的在我的Linux OS像下面的地址地址:获取的IPv6在Linux中使用的ioctl

sd = Socket_m(AF_INET6_m, SOCK_DGRAM_m, 0); 

ifc.ifc_buf = buffer_p; 
ifc.ifc_len = buffSize; 
Ioctl_m(sd, SIOCGIFCONF, &ifc); 

它可以成功地如果有IPv4地址的配置界面,但如果接口只有一个IPv6地址它不是由ioctl返回的。

例如,我不能,因为只有IPv6地址配置获得followith接口的IPv6地址:

br1  Link encap:Ethernet HWaddr 00:10:18:2D:BB:34 
      inet6 addr: fe80::210:18ff:fe2d:be54/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:194244850 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:72005 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:12331900995 (11760.6 Mb) TX bytes:6192406 (5.9 Mb) 

回答

12

是的,这是IOCTL遗产,将不会返回IPv6的。每个平台都有获得IPv6的那些不同的方式:

  • Linux上,使用NETLINK如果你是疯了,用​​如果你有一个隐约的glibc最近,否则读/proc/net/if_inet6(如Android上)。
  • 达尔文或FreeBSD:使用​​。
  • Solaris中,使用SIOCGLIFCONF
  • AIX,使用SIOCGIFCONF它实际上返回IPv4和IPv6地址(因为它们有sa_len字段在struct sockaddr它们实际上可以支持它)。
+0

非常感谢您对clarifation,请你帮我理解“的/ proc /净/ if_inet6”的格式,我怎么能确定UP和非回送地址?我读http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-net.html,但目前尚不清楚.. –

+0

该文档是相当明确的 - 它的“接口标志”你以后。查看IFF_LOOPBACK和IFF_UP的系统头文件中的值(“if.h”)。如果你试图用shell解析if_inet6,你可以使用awk提取正确的字段,并用'&'与相关常量进行与运算。 –

3

这可能将无法正常工作。

man 7 netdevice

SIOCGIFCONF

返回接口(传输层)地址的列表。这 目前意味着AF_INET(IPv4)的家庭 兼容性的唯一地址。

[...]

NOTES

[...]

本地IPv6的IP地址可以通过/ proc /净或经由 的rtnetlink(7)中找到。

+0

我不能使用由Nicholas Wilson提出的路由套接字,我需要一个LSB​​兼容的方式,但是注意到它是不可能的? –

+0

@Unmanner:如果您需要知道套接字在本地绑定的地址,请使用getsockname()。如果您需要查找所有本地接口的地址,请使用'getifaddrs()'或读出* Nicholas Wilson *在他的答案中提出的'/ proc/net/if_inet6'。 – alk