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

linux 系统获取网络ip, mask, gateway, dns信息小程序的更多相关文章

  1. 如何配置Linux系统的网络IP地址

    一台安装了Linux系统的电脑如果想要联网,首先要做的就是进行网络配置.今天小编就以CentOS6.4系统为例为大家介绍整个网络配置的过程,虽然只是以CentOS6.4系统为例,但是其它的Linux系 ...

  2. (转)Linux系统基础网络配置老鸟精华篇

    Linux系统基础网络配置老鸟精华篇 原文:http://blog.51cto.com/oldboy/784625 对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太 ...

  3. CentOS(六)--Linux系统的网络环境配置

    Linux系统下的网络环境配置,Linux.Unix就是网络的世界,所以在Linux系统中如何配置网络环境变量是至关重要的,这里将会给出3种Linux系统下网络环境配置的方法! 在配置网络环境之前,首 ...

  4. Linux 系统的网络基础_【all】

    网络基础 1.网线:568B: 白橙 橙色 白绿 蓝色 白蓝 绿色 白棕 棕色 2.交换机:电信号转发的网络设备,它可以为接入交换机的任2个网络节点设备提供电信号通信 3.路由器:连接局域网,广域网的 ...

  5. Linux系统基本网络配置之ifconfig命令

    Linux系统基本网络配置之ifconfig命令 一.Linux系统的网络配置基本包括:网络IP的配置.网关路由的配置.主机DNS的配置.主机名的配置等,本篇注重介绍网络IP的配置. 二.Linux系 ...

  6. Linux系统之网络相关的命令

    Linux系统之网络相关的命令 网络概述 网络:通过通信介质和通信设备 将分布不同地点的两台或多台计算机,经过相应的程序实现通信switch 交换机router 路由器网络的功能:数据通信:利用网络传 ...

  7. 获得Unix/Linux系统中的IP、MAC地址等信息

    获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 ...

  8. Linux系统NFS网络文件系统

    Linux系统NFS网络文件系统 NFS(network file system)网络文件系统,就是通过网络让不同的主机系统之间可以共享文件或目录,此种方法NFS客户端使用挂载的方式让共享文件或目录到 ...

  9. Linux如何配置网络ip?

    Linux如何配置网络ip? 1.首先切换至root用户 su root 输入root用户密码 2.借助dhclient工具自动生成一个网络内可用的ip地址 我们可以手动配置对应的网段的ip地址,但是 ...

随机推荐

  1. print neatly 整齐打印 算法导论

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098562.html 题目链接:print neatly 整齐打印 算法导论 考虑在一个打印 ...

  2. HDOJ(1001) Sum Problem

    这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题: 四则运算符(+.-.*./)和求余运算符(%)结合性都是从左到右. 于是,我自己写了一个版本,主要是考虑( ...

  3. Java知识总结--JDBC&XML

    1说说jdbc连接数据库的步骤 1.注册驱动 2.获得连接 3.执行sql语句 4.获得结果集,进行结果集的处理 5.关闭结果集 6.关闭连接,释放资源 2 statement 和preparedst ...

  4. php 工作模式

    PHP运行模式 1.cgi通用网关接口 (少用)2.fast-cgi常驻型的 cgi [ngixn常用]3.cli命令运行 (命令行用得多)4.web模块模式(apache等web服务器的运行模式)[ ...

  5. 使用css3背景渐变中的透明度来设置不同颜色的背景渐变

    为了添加透明度,我们使用 rgba() 函数来定义颜色结点.rgba() 函数中的最后一个参数可以是从 0 到 1 的值,它定义了颜色的透明度:0 表示完全透明,1 表示完全不透明.rgba()后面的 ...

  6. HTML5元素拖拽实现示例

    HTML5现在前端圈中,已然成为一个不那么新的技术词汇了,很多公司也把HTML5也当成了硬性的技能要求,但是很多前端恐怕都不了解HTML5的拖拽怎么实现吧. 看了下极客学院的视频,大概的了解了下思路. ...

  7. 前端资源多个产品整站一键打包&包版本管理(四)—— js&css文件文件打包并生成哈希后缀,自动写入路径、解决资源缓存问题。

    问题: 当我们版本更新的时候,我们都要清理缓存的js跟css,如何使得在网页中不需要手动清理呢? 答案: 生成带有哈希后缀的js跟css文件 1.文件路径 路径中的conf.js 是用于放置全局打包的 ...

  8. 021,lambda 表达式

    021,lambda 表达式  匿名函数: 快速定义单行的最小函数,是从lisp借用来的,可以用在任何需要函数的地方 >>> def ds(x):     return 2*x +  ...

  9. 由12306出错想到的div垂直居中的问题

    今天想看看元旦回家还有没有余票,偷偷的打开了12306,开始查询回家的车票,结果发现,竟然查询不出来,再查直接出错了 看到这个很郁闷,很纠结,但是突然想到了最近一直想实现div垂直居中,赶紧试了一下1 ...

  10. 开发设计模式(七)工厂模式(Factory Method Pattern)

    工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根 ...