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);
    }

  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/lidabo/p/5100622.html
Copyright © 2011-2022 走看看