zoukankan      html  css  js  c++  java
  • linux 系统获取网络ip, mask, gateway, dns信息小程序

    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! ");
            return -1;
        }

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

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

        if(ioctl(fd, SIOCGIFADDR, &ifr) < 0)
        {
            DEBUG_PRT("SIOCGIFADDR socket failed ");
            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 ");
            return; 
        }
        cmd_run("route | grep default", buf, 1024);
        if(0 == strlen(buf))
        {
            DEBUG_PRT("get gateway error ");
            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] = '';  
    }

    /**
     * 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 ");
            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 ");
            return; 
        }
        
        if(0 == strlen(buf))
        {
            DEBUG_PRT("get mask error ");
            return;
        }
        p = strstr2(buf, "Mask:");
        if(NULL == p)
        {
            DEBUG_PRT("get mask error ");
            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 ", __func__);
            return -1;
        }
        size = read(fd, strBuf, buf_size);
        if(size < 0)
        {
            DEBUG_PRT("%s read file len error ", __func__);
            close(fd);
            return -1;
        }
        strBuf[buf_size] = '';
        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 ] = '';
                
                q = p;
                while(*q != ' ')
                {
                    q++;
                    count++;
                }
                i += (sizeof("nameserver") + count);
                
                if(1 == j)
                {
                    memcpy(dns1, p, count);
                    dns1[count]='';
                }
                else if(2 == j)
                {
                    memcpy(dns2, p, count);
                    dns2[count]='';
                }
            } 
            else 
            {
                i++;
            }
        }

        return 0;
    }

    main.c

    void main(void)

    {

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

            char buf[1024] = {''};

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

        extern int get_dns(char *dns1, char *dns2);
        get_dns(buf, &buf[100]);
        printf("get_dns: %s %s ", buf, &buf[100]);
        memset(buf, '', 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]={''};
        unsigned int dest_addr=0, gate_addr=0;
        if(NULL == gateway)
        {
            DEBUG_PRT("gateway is NULL ");
            return; 
        }
        fp = fopen("/proc/net/route", "r");    
        if(fp == NULL){  
            DEBUG_PRT("fopen error ");
            return;   
        }
        
        fgets(buf, sizeof(buf), fp);    
        while(fgets(buf, sizeof(buf), fp)) 
        {    
            if((sscanf(buf, "%s %X %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 ");
            close(sockfd);
            return ;
        }

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

  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/lidabo/p/5100622.html
Copyright © 2011-2022 走看看