LINUX下C语言读取网卡IP

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

1、代码案例

c 复制代码
    #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权限来执行此操作。

编译并运行此程序:

bash 复制代码
    gcc -o get_ip get_ip.c
    sudo ./get_ip

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

相关推荐
2302_7995257410 分钟前
【Linux】第二十四章 管理网络安全
linux·网络·web安全
christine-rr18 分钟前
【25软考网工】第七章 (2)UOS Linux文件和目录管理、用户和组管理
linux·运维·服务器·网络工程师·软考
widder_1 小时前
软考中级软件设计师——计算机网络 IP地址与子网掩码相关题型
网络协议·tcp/ip·计算机网络
前进的程序员1 小时前
Linux 移植 Docker 详解
linux·运维·docker
散着步的码农1 小时前
RustDesk CentOS自建中继节点
linux·centos
瀚高PG实验室1 小时前
hghac集群服务器时间同步(chrony同步)
linux·运维·服务器
huangyuchi.1 小时前
【Linux】初见,基础指令
linux·运维·服务器·笔记·开发工具·指令·基础指令
huangyuchi.1 小时前
【Linux】初见,基础指令(续)
linux·运维·服务器·开发语言·笔记·指令·linux指令
梁下轻语的秋缘1 小时前
每日c/c++题 备战蓝桥杯(洛谷P1440 求m区间内的最小值 详解(单调队列优化))
c语言·c++·蓝桥杯
Eric.Lee20211 小时前
ROS2 pkg 创建功能包
java·linux·开发语言