linux c对面ip获取mac,linux下C获取MAC地址、ip等

//必须先获得套接口清单,得到设备名,并导入进入才能获取其他的信息

//设备eth1、lo

//获取信息后保存在--.sa_data存在偏移,暂时没弄懂

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXINTERFACE16

int main()

{

int i;

char *device="eth1";

struct ifreq req;//以下有这两结构体的详细说明

struct ifconf ifc;

struct ifreq buf[MAXINTERFACE];

int sockfd;

int interface;

int err;

unsigned char temp[6];

ifc.ifc_len = sizeof(buf);//两者的初始化必须进行,否则有些值不能确定

ifc.ifc_buf =(__caddr_t)buf;//类型强制转换

printf("init:ifc.ifc_len's len=%d----struct ifreq len=%d\n",ifc.ifc_len,sizeof(struct ifreq));

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

return -1;

}

err = ioctl(sockfd, SIOCGIFCONF, &ifc); //获取所有接口信息,重新填充了上面的值

if(err == 0)//成功0,失败 -1

{

interface = ifc.ifc_len/sizeof(struct ifreq);//由此知存在几个设备接口

printf("interface num: %d\n",interface);

}

else

{

return -1;

}

while(interface-- >0)

{

printf("Device name: %s\n",buf[interface].ifr_name);//设备名

strcpy(req.ifr_name,buf[interface].ifr_name);//必须导入设备名才能正常获取信息

err = ioctl(sockfd,SIOCGIFHWADDR,&req);//mac

if(err == 0)

{

printf("MACADDR: %02X-%02X-%02X-%02X-%02X-%02X\n",

(unsigned char)req.ifr_hwaddr.sa_data[0],

(unsigned char)req.ifr_hwaddr.sa_data[1],

(unsigned char)req.ifr_hwaddr.sa_data[2],

(unsigned char)req.ifr_hwaddr.sa_data[3],

(unsigned char)req.ifr_hwaddr.sa_data[4],

(unsigned char)req.ifr_hwaddr.sa_data[5]);

}

err = ioctl(sockfd,SIOCGIFADDR,&req);//ip

if(err == 0)

{

printf("inet addr :%s\n",inet_ntoa(((struct sockaddr_in*)&(req.ifr_addr))->sin_addr));

}

err = ioctl(sockfd,SIOCGIFBRDADDR,&req);//bcast

if(err == 0)

{

printf("BCAST: %03d.%03d.%03d.%03d\n",

(unsigned char)req.ifr_broadaddr.sa_data[2],//为什么偏移了两个字节暂时没弄清

(unsigned char)req.ifr_broadaddr.sa_data[3],

(unsigned char)req.ifr_broadaddr.sa_data[4],

(unsigned char)req.ifr_broadaddr.sa_data[5]);

}

err = ioctl(sockfd,SIOCGIFNETMASK,&req);//mask

if(err == 0)

{

printf("Mask: %03d.%03d.%03d.%03d\n",

(unsigned char)req.ifr_netmask.sa_data[2],

(unsigned char)req.ifr_netmask.sa_data[3],

(unsigned char)req.ifr_netmask.sa_data[4],

(unsigned char)req.ifr_netmask.sa_data[5]);

}

}

close(sockfd);

return 0;

}

//直接编译、运行。结果与ifconfig后一致

//以下为头文件中,对结构体的定义或重命名。简化了结构体也方便阅读

/*

struct sockaddr

{

unsigned short sa_family;

char sa_data[14];

}

struct sockaddr_in

{

short int sin_family; //* Address family   其实sockaddr_in与sockaddr意义一致,表达不同而已,都占16字节

unsigned short int sin_port; //* Port number   且在调用的时候,我们用此变量,但函数中类型规定要用(struct sockaddr *)

struct in_addr sin_addr; //* Internet address

unsigned char sin_zero[8]; //* Same size as struct sockaddr

};

struct in_addr

{

unsigned long S_addr;

}

struct ifreq

{

# define IFHWADDRLEN 6

# define IFNAMSIZ IF_NAMESIZE

union

{

char ifrn_name[IFNAMSIZ]; // Interface name, e.g. "en0".

} ifr_ifrn;

union

{

struct sockaddr ifru_addr;

struct sockaddr ifru_dstaddr;

struct sockaddr ifru_broadaddr;

struct sockaddr ifru_netmask;

struct sockaddr ifru_hwaddr;

short int ifru_flags;

int ifru_ivalue;

int ifru_mtu;

struct ifmap ifru_map;

char ifru_slave[IFNAMSIZ]; // Just fits the size

char ifru_newname[IFNAMSIZ];

__caddr_t ifru_data;

} ifr_ifru;

};

# define ifr_name ifr_ifrn.ifrn_name //* interface name

# define ifr_hwaddr ifr_ifru.ifru_hwaddr //* MAC address

# define ifr_addr ifr_ifru.ifru_addr //* address

# define ifr_dstaddr ifr_ifru.ifru_dstaddr //* other end of p-p lnk

# define ifr_broadaddr ifr_ifru.ifru_broadaddr //* broadcast address

# define ifr_netmask ifr_ifru.ifru_netmask //* interface net mask

# define ifr_flags ifr_ifru.ifru_flags //* flags

# define ifr_metric ifr_ifru.ifru_ivalue //* metric

# define ifr_mtu ifr_ifru.ifru_mtu //* mtu

# define ifr_map ifr_ifru.ifru_map //* device map

# define ifr_slave ifr_ifru.ifru_slave //* slave device

# define ifr_data ifr_ifru.ifru_data //* for use by interface

# define ifr_ifindex ifr_ifru.ifru_ivalue //* interface index

# define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth

# define ifr_qlen ifr_ifru.ifru_ivalue //* queue length

# define ifr_newname ifr_ifru.ifru_newname //* New name

# define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)

# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)

# define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0) */

/* Structure used in SIOCGIFCONF request. Used to retrieve interface

configuration for machine (useful for programs which must know all

networks accessible). */

/*

struct ifconf

{

int ifc_len; // Size of buffer.

union

{

__caddr_t ifcu_buf;

struct ifreq *ifcu_req;

} ifc_ifcu;

};

# define ifc_buf ifc_ifcu.ifcu_buf // Buffer address.

# define ifc_req ifc_ifcu.ifcu_req // Array of structures.

# define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) // not right

几种结构体的级别:struct ifconf > struct ifreq > struct sockaddr 前者嵌套后者

*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值