Linux下获取MAC及IP源码及解析

在linux中获取IP及MAC代码如下


int getIPMAC()

{
    int sock;
    struct sockaddr_in sin;
    unsigned char mac[6];
    struct ifreq ifr;
    
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock == -1)
    {
        perror("socket");
        return -1;
    }
    
    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, ETH_NAME, strlen(ETH_NAME));
    
    if(ioctl(sock, SIOCGIFADDR, &ifr) == 0)
    {
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        fprintf(stdout, "%s : %s\n", ETH_NAME, inet_ntoa(sin.sin_addr));
        
    }    
    
    if(ioctl(sock, SIOCGIFHWADDR, &ifr) == 0)
    {
        memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
        fprintf(stdout, "hard ware addr: %x:%x:%x:%x:%x:%x\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
    }
    return 0;

}

 在linux中获取IP及MAC须用到ioctl函数及struct ifreq结构

 首先,我们来看看ioctl函数

函数头文件: #include <sys/ioctl.h>

函数原型:  int ioctrl(int fd, int request, .../*(void *agrv */)

返回值:正常返回0,错误返回-1

在这里简单说一下ioctl

ioctl的第三个参数总为一个指针,但其类型信赖于request的参数,在这里我只简单说一下第三个指针为struct ifreq类型时,第二个参数的可选内容

若对ioctl兴趣的可以去度娘找找其他的

我现在简单介绍下在第三个参数为struct ifreq类型时,request的取值意义:

Request 

SIOCSIFADDR             设置接口地址

SIOCGIFADDR             获取接口地址

SIOCSIFFLAGS            设置接口标志

SIOCGIFFLAGS            获取接口标志

SIOCSIFDSTADDR      设置点到点的地址

SIOCGIFDSTADDR     获取点到点的地址

SIOCSIFBRDADDR     设置广播地址

SIOCGIFBRDADDR     获取广播地址

SIOCSIFNETMASK      设置子网掩码

SIOCGIFNETMASK      获取子网掩码

SIOCGIFMTU                 获取MTU      

SIOCxxx                          其他的请参考系统实现


说完ioctl,现在来说说struct ifreq结构

struct ifreq
{
    char ifr_name[IFNAMESIZE};
    union
    {        
        struct sockaddr ifru_addr;
        struct sockaddr ifru_dstaddr;
        struct sockaddr ifru_broadaddr;
        short ifru_flags;
        int ifru_metric;
        caddr_t ifru_data;
    }ifr_ifru;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值