获取的IPv6在Linux中使用的ioctl
我试图让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)
是的,这是IOCTL遗产,将不会返回IPv6的。每个平台都有获得IPv6的那些不同的方式:
- Linux上,使用NETLINK如果你是疯了,用如果你有一个隐约的glibc最近,否则读
/proc/net/if_inet6
(如Android上)。 - 达尔文或FreeBSD:使用。
- Solaris中,使用
SIOCGLIFCONF
。 - AIX,使用
SIOCGIFCONF
它实际上返回IPv4和IPv6地址(因为它们有sa_len
字段在struct sockaddr
它们实际上可以支持它)。
这可能将无法正常工作。
SIOCGIFCONF
返回接口(传输层)地址的列表。这 目前意味着AF_INET(IPv4)的家庭 兼容性的唯一地址。
[...]
NOTES
[...]
本地IPv6的IP地址可以通过/ proc /净或经由 的rtnetlink(7)中找到。
我不能使用由Nicholas Wilson提出的路由套接字,我需要一个LSB兼容的方式,但是注意到它是不可能的? –
@Unmanner:如果您需要知道套接字在本地绑定的地址,请使用getsockname()。如果您需要查找所有本地接口的地址,请使用'getifaddrs()'或读出* Nicholas Wilson *在他的答案中提出的'/ proc/net/if_inet6'。 – alk
非常感谢您对clarifation,请你帮我理解“的/ proc /净/ if_inet6”的格式,我怎么能确定UP和非回送地址?我读http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-net.html,但目前尚不清楚.. –
该文档是相当明确的 - 它的“接口标志”你以后。查看IFF_LOOPBACK和IFF_UP的系统头文件中的值(“if.h”)。如果你试图用shell解析if_inet6,你可以使用awk提取正确的字段,并用'&'与相关常量进行与运算。 –