linux下获取IP和硬件地址

发表于: 2012年12月29 00:00

在linux下获取当前的IP地址我们用ifconfig命令 但是如果通过编程怎么实现呢?下面的代码或许有一点启示

这里用到的函数有:

socket 创建套节字

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就

是对设备的一些特性进行控制

下面是用到的两个参数

宏定义 SIOCGIFHWADDR表示获取接口的硬件地址

宏定义 SIOCGIFADDR 表示获取ip地址

ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。 其中包含了一个接口的名 字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。

:::cpp

#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<net/if.h>
#include<sys/ioctl.h>
#include<arpa/inet.h>

void  getlocalnetinfo(char *interface )
{
    int sockfd,i;
    struct ifreq ifr;
    char buf[20];
    sockfd=socket(AF_INET,SOCK_DGRAM,0);
    strcpy(ifr.ifr_name,interface);//指定接口名,也就是网卡名如eth0
    if(ioctl(sockfd,SIOCGIFADDR,&ifr)<-1)
    {
        perror("ioctl");
    }
    else
    {
        //inet_ntoa将网络字节序的ip转换为点分十进制
        printf("IP:%s\n",inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr));
    }
    if(ioctl(sockfd,SIOCGIFHWADDR,&ifr)<-1)
    {
        perror("ioctl");
    }
    else
    {
        buf[0]='\0';
        for(i=0;i<6;i++)
            sprintf(buf+3*i,"%02x:",(unsigned char)ifr.ifr_hwaddr.sa_data[i]);
        buf[17]='\0';
        printf("Mac:%s\n",buf);
        //输出mac地址
    }
}
int main(int argc,char **args)
{
    if(argc==2)
    {
        getlocalnetinfo(args[1]);
    }
    return 0;
}
© 2018 - fluyy - 粤ICP备17114935号