当前位置:首页 > 行业动态 > 正文

如何在C语言中获取Linux系统的网卡IP地址?

在 Linux 中,你可以使用命令 ip addr showifconfig 来获取网卡的 IP 地址。

在Linux操作系统中,获取网卡的IP地址是一项常见且重要的任务,通过C语言编程,可以使用系统调用和库函数来实现这一目标,以下是详细的步骤和示例代码:

使用`ioctl`函数获取网卡信息

ioctl函数是Linux系统中用于设备控制的重要系统调用之一,可以通过它获取网络接口的各种信息,包括IP地址、MAC地址等,以下是一个使用ioctl函数获取网卡信息的完整示例:

#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <errno.h>
int getLocalInfo(void)
{
    int fd;
    int interfaceNum = 0;
    struct ifreq buf[16];
    struct ifconf ifc;
    struct ifreq ifrcopy;
    char mac[16] = {0};
    char ip[32] = {0};
    char broadAddr[32] = {0};
    char subnetMask[32] = {0};
    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
        close(fd);
        return -1;
    }
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = (caddr_t)buf;
    if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc))
    {
        interfaceNum = ifc.ifc_len / sizeof(struct ifreq);
        printf("interface num = %dn", interfaceNum);
        while (interfaceNum-> 0)
        {
            printf("ndevice name: %sn", buf[interfaceNum].ifr_name);
            // ignore the interface that not up or not running
            ifrcopy = buf[interfaceNum];
            if (ioctl(fd, SIOCGIFFLAGS, &ifrcopy))
            {
                printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
            // get the mac of this interface
            if (!ioctl(fd, SIOCGIFHWADDR, (char *)(&buf[interfaceNum]))
            {
                memset(mac, 0, sizeof(mac));
                snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x",
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[0],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[1],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[2],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[3],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[4],
                    (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[5]);
                printf("device mac: %sn", mac);
            } else
            {
                printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
            // get the IP of this interface
            if (!ioctl(fd, SIOCGIFADDR, (char *)&buf[interfaceNum]))
            {
                snprintf(ip, sizeof(ip), "%s",
                    (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_addr))->sin_addr));
                printf("device ip: %sn", ip);
            } else
            {
                printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
        }
    } else
    {
        printf("ioctl: %s [%s:%d]n", strerror(errno), __FILE__, __LINE__);
        close(fd);
        return -1;
    }
    close(fd);
    return 0;
}

2. 使用getifaddrs函数获取网卡信息

如何在C语言中获取Linux系统的网卡IP地址?

getifaddrs函数可以获取所有网络接口的信息,并存储在链表中,以下是一个使用getifaddrs函数获取网卡信息的完整示例:

#include <stdio.h>
#include <string.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <errno.h>
int main() {
    struct ifaddrs *ifaddr, *ifa;
    int family, s;
    char host[NI_MAXHOST];
    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        return -1;
    }
    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == NULL) continue;
        family = ifa->ifa_addr->sa_family;
        if (family == AF_INET || family == AF_INET6) {
            s = getnameinfo(ifa->ifa_addr,
                           (family == AF_INET) ? sizeof(struct sockaddr_in) :
                           sizeof(struct sockaddr_in6),
                           host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
            if (s != 0) {
                printf("getnameinfo() failed: %s
", gai_strerror(s));
                break;
            }
            printf("%s
", host);
        }
    }
    freeifaddrs(ifaddr);
    return 0;
}

使用`ip`命令获取网卡信息

虽然ip命令通常在shell中使用,但也可以通过C语言调用系统命令来执行,以下是一个使用system函数调用ip命令获取网卡信息的示例:

#include <stdio.h>
#include <stdlib.h>
int main() {
    system("ip addr show");
    return 0;
}

方法均可用于获取Linux系统中网卡的IP地址和其他相关信息,选择哪种方法取决于具体的需求和使用场景:

如何在C语言中获取Linux系统的网卡IP地址?

ioctl函数适合需要详细控制和高效性能的场景。

getifaddrs函数提供了更高层次的API,使用起来更加方便。

ip命令适用于简单的脚本或临时调试。

如何在C语言中获取Linux系统的网卡IP地址?

在选择方法时,应考虑程序的可移植性、性能要求以及开发和维护的便捷性。