LINUX下C语言读取网卡IP

在Linux系统下,C语言可以通过读取系统文件来获取网卡的IP地址。

1、示例程序1

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    int get_ip_address(const char *ifname, char *ip_str, size_t size) {
        struct sockaddr_in sa;
        int fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (fd < 0) {
            perror("socket");
            return -1;
        }
    
        memset(&sa, 0, sizeof(sa));
        sa.sin_family = AF_INET;
        sa.sin_addr.s_addr = INADDR_ANY;
    
        if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
            perror("bind");
            close(fd);
            return -1;
        }
    
        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) < 0) {
            perror("setsockopt");
            close(fd);
            return -1;
        }
    
        if (getsockname(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
            perror("getsockname");
            close(fd);
            return -1;
        }
    
        close(fd);
    
        if (sa.sin_family != AF_INET) {
            fprintf(stderr, "Unsupported address family\\n");
            return -1;
        }
    
        inet_ntop(AF_INET, &(sa.sin_addr), ip_str, size);
        return 0;
    }
    
    int main() {
        char ip[INET_ADDRSTRLEN];
        if (get_ip_address("eth0", ip, sizeof(ip)) < 0) {
            fprintf(stderr, "Failed to get IP address\\n");
            return EXIT_FAILURE;
        }
    
        printf("IP Address: %s\\n", ip);
        return EXIT_SUCCESS;
    }

这个程序首先创建了一个UDP套接字,并绑定到任何可用的IP地址和端口上。然后,它使用getsockname函数获取套接字的本地地址,这个地址就是当前使用的IP地址。最后,程序使用inet_ntop函数将IP地址从二进制格式转换为可读的字符串格式。

请注意,这个程序假设eth0是您想要获取IP地址的网卡名称。在不同的Linux系统中,网卡的名称可能不同(例如,可能是eth1enp0s3等)。此外,某些系统可能需要root权限来执行此操作。

编译并运行此程序:

    gcc -o get_ip get_ip.c
    sudo ./get_ip

这将输出eth0网卡的IP地址。

在Linux系统中,可以使用C语言编写程序来读取网卡的相关信息。通常,这涉及到使用系统调用和库函数来访问网络接口的状态和统计信息。以下是一个简单的示例程序,展示如何使用C语言读取网卡的IP地址和MAC地址。

示例程序2:读取网卡的IP地址和MAC地址

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <sys/ioctl.h>

void get_ip_address(const char *ifname, char *ip_address, size_t ip_len) {
    int fd;
    struct ifreq ifr;

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    ifr.ifr_addr.sa_family = AF_INET;
    strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);

    if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) {
        inet_ntop(AF_INET, &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, ip_address, ip_len);
    } else {
        strncpy(ip_address, "N/A", ip_len);
    }

    close(fd);
}

void get_mac_address(const char *ifname, char *mac_address, size_t mac_len) {
    int fd;
    struct ifreq ifr;

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    ifr.ifr_addr.sa_family = AF_INET;
    strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);

    if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) {
        unsigned char *mac = (unsigned char *)ifr.ifr_hwaddr.sa_data;
        snprintf(mac_address, mac_len, "%02X:%02X:%02X:%02X:%02X:%02X",
                 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    } else {
        strncpy(mac_address, "N/A", mac_len);
    }

    close(fd);
}

int main() {
    char ifname[] = "eth0"; // 网卡名称
    char ip_address[INET_ADDRSTRLEN];
    char mac_address[18];

    get_ip_address(ifname, ip_address, sizeof(ip_address));
    get_mac_address(ifname, mac_address, sizeof(mac_address));

    printf("Interface: %s\\n", ifname);
    printf("IP Address: %s\\n", ip_address);
    printf("MAC Address: %s\\n", mac_address);

    return 0;
}

编译和运行

  1. 将上述代码保存到一个文件中,例如get_net_info.c

  2. 使用以下命令编译程序:

    gcc -o get_net_info get_net_info.c

  3. 运行编译后的程序:

    ./get_net_info

解释

  • get_ip_address函数使用ioctl系统调用获取指定网卡的IP地址。
  • get_mac_address函数使用ioctl系统调用获取指定网卡的MAC地址。
  • main函数中定义了网卡名称eth0,并调用上述两个函数获取并打印IP地址和MAC地址。

注意事项

  • 确保程序运行时有足够的权限(通常需要root权限)。
  • 根据实际情况修改网卡名称(例如eth0)为你的系统中存在的网卡名称。

通过这种方式,你可以使用C语言读取Linux系统中网卡的相关信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁茹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值