素槿
Published on 2025-08-22 / 3 Visits
0

C语言获取网卡名称和IP

原理

使用 getifaddrs接口获取网卡信息。

实现

#include <arpa/inet.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    struct ifaddrs *ifaddr, *ifa;
    int             family;
    char            host[NI_MAXHOST];
    // 获取网卡信息
    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }
    // 遍历网卡
    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == NULL) continue;
        family = ifa->ifa_addr->sa_family;
        // 输出网卡名称,协议
        printf("%s  address family: %d%s ", ifa->ifa_name, family,
               (family == PF_PACKET)  ? " (AF_PACKET)"
               : (family == PF_INET)  ? " (AF_INET)"
               : (family == PF_INET6) ? " (AF_INET6)"
                                      : "");
        // 输出IP地址
        if (family == PF_INET) {
            in_addr* tmpAddrPtr =
                &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
            inet_ntop(PF_INET, tmpAddrPtr, host, INET_ADDRSTRLEN);
            printf("\taddress: <%s>\n", host);
        }
        if (family == PF_INET6) {
            in_addr* tmpAddrPtr =
                &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
            inet_ntop(PF_INET6, tmpAddrPtr, host, INET6_ADDRSTRLEN);
            printf("\taddress: <%s>\n", host);
        }
        printf("\n");
    }

    freeifaddrs(ifaddr);
    exit(EXIT_SUCCESS);
}