Я пытаюсь получить IPv6-адрес в моей ОС Linux как следующее:Получить адреса 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)
Большое спасибо за разъяснение, не могли бы вы помочь мне с пониманием формата «/ proc/net/if_inet6», как я могу определить адреса UP и non-loopback? Я читал http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-net.html, но это не ясно. –
Документы довольно понятны - это «флаги интерфейса», которые вы используете. См. Значения в заголовках системы («if.h») для 'IFF_LOOPBACK' и' IFF_UP'. Если вы пытаетесь разобрать if_inet6 с помощью оболочки, вы можете извлечь правое поле с помощью awk и AND с соответствующей константой с помощью '&'. –