Я пытаюсь получить информацию о сетевом интерфейсе из struct ifaddrs.
Как я могу определить, является ли интерфейс, на который я смотрю, inet (ipv4) или inet6 (ipv6)?
Я пытаюсь получить информацию о сетевом интерфейсе из struct ifaddrs.
Как я могу определить, является ли интерфейс, на который я смотрю, inet (ipv4) или inet6 (ipv6)?
Вы тестируете ifa_addr->sa_family
— это будет AF_INET
для адресов IPv4 и AF_INET6
для адресов IPv6.
Затем вы можете преобразовать элемент ifa_addr
либо в struct sockaddr_in *
, либо в struct sockaddr_in6 *
в зависимости от ситуации.
В FreeBSD, при условии, что у вас есть поддержка ядра для обоих, вопрос IPv4 или IPv6 — это просто вопрос конфигурации.
Ядро «GENERIC» во FreeBSD включает опцию «INET6», которая дает вам IPV6. Если вы не пересобирали ядро и исключили эту опцию, то вы получите IPv6 на любом интерфейсе, просто настроив адрес IPv6.
Вы можете попробовать открыть сокет IPV6 на интерфейсе, чтобы узнать, поддерживает ли он IPV6.