天天看點

嵌入式 hi3518平台擷取網絡環境中的ip、netmask、broadcast等資訊

嵌入式 hi3518平台擷取網絡環境中的ip、netmask、broadcast等資訊

<span style="font-family:Courier New;">  

/********************************** (C) COPYRIGHT *******************************  

 * File Name          : get_netinfo.c  

 * Author              : skdkjzz  

 * Date                 : 2014/08/07  

 * Description        : linux下擷取網卡資訊  

 *********************************************************************************/  

#include <stdio.h>  

#include <stdlib.h>  

#include <string.h>  

#include <sys/types.h>  

#include <sys/socket.h>  

#include <netinet/in.h>  

#include <linux/if.h>  

#include <arpa/inet.h>  

#include <linux/sockios.h>  

int main(int argc,char*argv[]){  

    int s;  

    int err;  

    s=socket(AF_INET,SOCK_DGRAM,0);  

    if(s<0){  

        perror("socket error");  

        return;  

    }  

    struct ifreq ifr;  

#if 1  

    memset(&ifr,0,sizeof(ifr));  

    ifr.ifr_ifindex=1;    /* 獲得第1個網絡接口的名稱 */  

    err=ioctl(s,SIOCGIFNAME,&ifr);  

    if(err)  

    {  

        perror("index error");  

    }else  

        printf("----------------------------------\n");  

        printf("The %dst net device is : %s\n",ifr.ifr_ifindex,ifr.ifr_name);  

    err=ioctl(s,SIOCGIFHWADDR,&ifr);   /* 獲得MAC位址 */  

    printf("%s:[%d] err is %d\n",__FUNCTION__,__LINE__,err);  

    if(!err)  

        unsigned char* hw=ifr.ifr_hwaddr.sa_data;  

        printf("Mac address is : %02x:%02x:%02x:%02x:%02x:%02x\n",hw[0],hw[1],hw[2],hw[3],hw[4],hw[5]);  

    else  

        printf("Mac address is : 00:00:00:00:00:00\n");  

    struct sockaddr_in *sin=(struct sockaddr_in*)&ifr.ifr_addr; /* 擷取網絡接口IP儲存的是二進制IP */  

    char ip[16];   /* 字元數組,存放字元串 */  

    memset(ip,0,16);  

    err=ioctl(s,SIOCGIFADDR,&ifr);  

        inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);  /* 轉換的字元串儲存到ip數組中,第二個參數是要轉換的二進制IP指針,第三個參數是轉換完成存放IP的緩沖區,最後一個參數是緩沖區的長度 */  

        printf("IP address is : %s\n",ip);  

        printf("IP address is : 0.0.0.0\n");  

    err=ioctl(s,SIOCGIFBRDADDR,&ifr);   /* 得到接口的廣播位址 */  

        struct sockaddr_in *broadcast=(struct sockaddr_in*)&ifr.ifr_broadaddr;  

        inet_ntop(AF_INET,&broadcast->sin_addr.s_addr,ip,16); /* 轉換成字元串,inet_ntop将二進制IP轉換成點分十進制的字元串 */  

        printf("BROADCAST IP is : %s\n",ip);  

        printf("BROADCAST IP is : 0.0.0.0\n",ip);  

    printf("----------------------------------\n");  

#else  

    ifr.ifr_ifindex=2;  /* 獲得第2個網絡接口的名稱 */  

    memcpy(ifr.ifr_name,argv[1],5);  

    if(err){  

    }else{  

    err=ioctl(s,SIOCGIFHWADDR,&ifr);  /* 獲得MAC位址 */  

    if(!err){  

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

        inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);  

    err=ioctl(s,SIOCGIFBRDADDR,&ifr);  /* 得到接口的廣播位址 */  

        inet_ntop(AF_INET,&broadcast->sin_addr.s_addr,ip,16);/* 轉換成字元串,inet_ntop将二進制IP轉換成點分十進制的字元串 */  

#endif  

    close(s);  

}  

</span>  

繼續閱讀