linux 系统获取网络ip, mask, gateway, dns信息小程序

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: net_util.c          #define WIRED_DEV                   "eth0"     #define WIRELESS_DEV                "ra0"               #define PPPOE_DEV                   "ppp0" #define DEBUG_PRT(fmt, arg.

net_util.c

 

       #define WIRED_DEV                   "eth0" 
    #define WIRELESS_DEV                "ra0"           
    #define PPPOE_DEV                   "ppp0"

#define DEBUG_PRT(fmt, arg...)      printf(fmt,##arg)

/**
 * get ip address.
 * @param net_dev net device.
 * @param ipaddr a pointer to save ip address.
 * @return 0 success, or fail.
 */
int get_ipaddr(const char *net_dev,  char *ipaddr)
{
    struct ifreq ifr;
    int fd = 0;
    struct sockaddr_in *pAddr;

    if((NULL == net_dev) || (NULL == ipaddr))
    {
        DEBUG_PRT("illegal call function SetGeneralIP! \n");
        return -1;
    }

    if((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
    {
        DEBUG_PRT("open socket failed \n");
        return -1;
    }

    memset(&ifr,0,sizeof(ifr));
    strcpy(ifr.ifr_name, net_dev);

    if(ioctl(fd, SIOCGIFADDR, &ifr) < 0)
    {
        DEBUG_PRT("SIOCGIFADDR socket failed \n");
        close(fd);
        return -1;
    }

    pAddr = (struct sockaddr_in *)&(ifr.ifr_addr);

    strcpy(ipaddr, inet_ntoa(pAddr->sin_addr));
    
    close(fd);
    
    return 0;
}

/**
 * get gateway.
 * @param gateway a pointer to save geteway.
 * @return none.
 */
void get_gateway(ITI_CHAR *gateway)
{
    char buf[1024]={0};
    char *p = NULL;
    char *q = NULL;
    int count = 0;
    if(NULL == gateway)
    {
        DEBUG_PRT("gateway is NULL \n");
        return; 
    }
    cmd_run("route | grep default", buf, 1024);
    if(0 == strlen(buf))
    {
        DEBUG_PRT("get gateway error \n");
        return;
    }

    p = strstr2(buf, "default");
    q = p;
    while(*q == ' ')
    {
        q++;
    }

    p = q;
    while(*p != ' ')
    {
        p++;
        count++;
    }
    if(NULL != q)
    {
        memcpy(gateway, q, count);
    }
    gateway[count] = '\0';  
}

/**
 * get mask.
 * @param net_dev net device.
 * @param mask a pointer to save mask.
 * @return none.
 */
void get_mask(const char *net_dev, ITI_CHAR *mask)
{
    char buf[1024]={0};
    char *p = NULL;
    if(NULL == mask)
    {
        DEBUG_PRT("mask is NULL \n");
        return; 
    }
    if(0 == (memcmp(WIRED_DEV, net_dev, sizeof(WIRED_DEV))))
    {
        cmd_run("ifconfig eth0 | grep Mask", buf, 1024);
    }
    else if(0 == (memcmp(WIRELESS_DEV, net_dev, sizeof(WIRELESS_DEV))))
    {
        cmd_run("ifconfig ra0 | grep Mask", buf, 1024);
    }
    else if(0 == (memcmp(PPPOE_DEV, net_dev, sizeof(PPPOE_DEV))))
    {
        cmd_run("ifconfig ppp0 | grep Mask", buf, 1024);
    }
    else 
    {
        DEBUG_PRT("net device not support \n");
        return; 
    }
    
    if(0 == strlen(buf))
    {
        DEBUG_PRT("get mask error \n");
        return;
    }
    p = strstr2(buf, "Mask:");
    if(NULL == p)
    {
        DEBUG_PRT("get mask error \n");
        return;
    }
    strcpy(mask, p);
}

/**
 * get dns.
 * @param dns1 a pointer to save first dns.
 * @param dns2 a pointer to save second dns.
 * @return 0 success, or fail.
 */
int get_dns(char *dns1, char *dns2)
{
    int fd = -1;
    int size = 0;
    char strBuf[100];
    char tmpBuf[100];
    int buf_size = sizeof(strBuf);
    char *p = NULL;
    char *q = NULL;
    int i = 0;
    int j = 0;
    int count = 0;
    
    fd = open("/etc/resolv.conf", O_RDONLY);
    if(-1 == fd)
    {
        DEBUG_PRT("%s open error \n", __func__);
        return -1;
    }
    size = read(fd, strBuf, buf_size);
    if(size < 0)
    {
        DEBUG_PRT("%s read file len error \n", __func__);
        close(fd);
        return -1;
    }
    strBuf[buf_size] = '\0';
    close(fd);

    while(i < buf_size)
    {
        if((p = strstr2(&strBuf[i], "nameserver")) != NULL)
        {
            j++;
            p += 1;
            count = 0;
            
            memset(tmpBuf, 0xff, 100);
            memcpy(tmpBuf, p, 100);
            tmpBuf[sizeof(tmpBuf) -1 ] = '\0';
            
            q = p;
            while(*q != '\n')
            {
                q++;
                count++;
            }
            i += (sizeof("nameserver") + count);
            
            if(1 == j)
            {
                memcpy(dns1, p, count);
                dns1[count]='\0';
            }
            else if(2 == j)
            {
                memcpy(dns2, p, count);
                dns2[count]='\0';
            }
        } 
        else 
        {
            i++;
        }
    }

    return 0;
}

 

main.c

void main(void)

{

        #define WIRED_DEV                   "eth0" 
    #define WIRELESS_DEV                "ra0"           
    #define PPPOE_DEV                   "ppp0"

        char buf[1024] = {'\0'};

    extern int get_ipaddr(const char *net_dev,  char *ipaddr);
    get_ipaddr(WIRED_DEV, buf);
    printf("get_ipaddr: %s \n", buf);
    memset(buf, '\0', sizeof(buf));
    
    extern void get_mask(const char *net_dev, ITI_CHAR *mask);
    get_mask(WIRED_DEV, buf);
    printf("get_mask: %s \n", buf);
    memset(buf, '\0', sizeof(buf));
    
    extern void get_gateway(ITI_CHAR *gateway);
    get_gateway(buf);
    printf("get_gateway: %s \n", buf);
    memset(buf, '\0', sizeof(buf));

    extern int get_dns(char *dns1, char *dns2);
    get_dns(buf, &buf[100]);
    printf("get_dns: %s %s\n", buf, &buf[100]);
    memset(buf, '\0', sizeof(buf));

}

 

makefile:

gcc main.c net_util.c -o get_net_info

 

./get_net_info

运行结果:

get_ipaddr: 192.168.9.142 
get_mask: 255.255.255.0
get_gateway: 192.168.9.254 
get_dns: 192.168.9.11 192.168.9.10

 

 

为提高执行效率, 更新获取网关和子网掩码程序:

static void get_gateway(const char *net_dev, char *gateway)
{
    FILE *fp;    
    char buf[1024];  
    char iface[16];    
    unsigned char tmp[100]={'\0'};
    unsigned int dest_addr=0, gate_addr=0;
    if(NULL == gateway)
    {
        DEBUG_PRT("gateway is NULL \n");
        return; 
    }
    fp = fopen("/proc/net/route", "r");    
    if(fp == NULL){  
        DEBUG_PRT("fopen error \n");
        return;   
    }
    
    fgets(buf, sizeof(buf), fp);    
    while(fgets(buf, sizeof(buf), fp)) 
    {    
        if((sscanf(buf, "%s\t%X\t%X", iface, &dest_addr, &gate_addr) == 3) 
            && (memcmp(net_dev, iface, strlen(net_dev)) == 0)
            && gate_addr != 0) 
        {
                memcpy(tmp, (unsigned char *)&gate_addr, 4);
                sprintf(gateway, "%d.%d.%d.%d", (unsigned char)*tmp, (unsigned char)*(tmp+1), (unsigned char)*(tmp+2), (unsigned char)*(tmp+3));
                break;    
        }
    }    
      
    fclose(fp);
}

static void get_mask(const char *net_dev, ITI_CHAR *mask)
{
    struct sockaddr_in *pAddr;
    struct ifreq ifr;
    int sockfd;

    sockfd = socket(AF_INET,SOCK_DGRAM,0);
    memset(&ifr,0,sizeof(ifr));
    strcpy(ifr.ifr_name, net_dev);
    
    if(ioctl(sockfd, SIOCGIFNETMASK, &ifr) < 0){
        DEBUG_PRT("SIOCGIFADDR socket failed \n");
        close(sockfd);
        return ;
    }

    pAddr = (struct sockaddr_in *)&(ifr.ifr_addr);
    strcpy(mask, (char *)(inet_ntoa(pAddr->sin_addr)));
    
    close(sockfd);
}

目录
相关文章
|
4天前
|
安全 虚拟化
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力。通过具体案例,展示了方案的制定和实施过程,强调了目标明确、技术先进、计划周密、风险可控和预算合理的重要性。
16 5
|
4天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
19 3
|
4天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
16 2
|
5天前
|
SQL 安全 网络安全
网络安全的护城河:漏洞防御与加密技术的深度解析
【10月更文挑战第37天】在数字时代的浪潮中,网络安全成为守护个人隐私与企业资产的坚固堡垒。本文将深入探讨网络安全的两大核心要素——安全漏洞和加密技术,以及如何通过提升安全意识来强化这道防线。文章旨在揭示网络攻防战的复杂性,并引导读者构建更为稳固的安全体系。
16 1
RS-485网络中的标准端接与交流电端接应用解析
RS-485,作为一种广泛应用的差分信号传输标准,因其传输距离远、抗干扰能力强、支持多点通讯等优点,在工业自动化、智能建筑、交通运输等领域得到了广泛应用。在构建RS-485网络时,端接技术扮演着至关重要的角色,它直接影响到网络的信号完整性、稳定性和通信质量。
|
4天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
25 3
|
4天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
18 3
|
7天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
23 6
|
4天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
15 2
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway

相关产品

  • 云解析DNS