«

»

Apr 03

pure c – как получить список сетевых интерфейсов

На линуксах. С помощью getifaddrs. Не забыть освобождать память под ifaddrs.
Эта функция просто выводит айпи адреса сетевых интерфейсов.
Если необходимо получить стастику – надо работать с адресами семейства AF_PACKET.

int check_net_interfaces()
{
    struct ifaddrs *ifaddr;
    int family, s;

    if (getifaddrs(&ifaddr) == -1)
    {
        perror("getifaddrs");
	return -1;
    }

    struct ifaddrs *ifa = ifaddr;
    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
    {
        if (ifa->ifa_addr != NULL)
        {
            int family = ifa->ifa_addr->sa_family;
            if (family == AF_INET || family == AF_INET6)
            {
                char ip_addr[NI_MAXHOST];
                int s = getnameinfo(ifa->ifa_addr,
                    ((family == AF_INET) ? sizeof(struct sockaddr_in) :
                    sizeof(struct sockaddr_in6)),
                    ip_addr, sizeof(ip_addr), NULL, 0, NI_NUMERICHOST);
                if (s != 0)
                {
                    printf("getnameinfo failed - can't determine our ip_interfaces");
                    return -1;
                }
                else
                {
                    /* add some processing here */
                    printf("IP - %s",ip_addr);
                }
            }
        }
    }
    freeifaddrs(ifaddr);
    return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>