Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417258
  • 博文数量: 82
  • 博客积分: 2600
  • 博客等级: 少校
  • 技术积分: 961
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-08 21:44
文章分类
文章存档

2013年(2)

2012年(56)

2010年(24)

我的朋友

分类:

2012-06-15 00:12:12

原文地址:Linux下获取mac地址 作者:i蛋炒饭

linux下获取mac地址比较简单,主要就是用到了一个结构体,如下:

点击(此处)折叠或打开

  1. /*
  2.  * Interface request structure used for socket
  3.  * ioctl's. All interface ioctl's must have parameter
  4.  * definitions which begin with ifr_name. The
  5.  * remainder may be interface specific.
  6.  */

  7. struct ifreq
  8. {
  9. #define IFHWADDRLEN    6
  10.     union
  11.     {
  12.         char    ifrn_name[IFNAMSIZ];        /* if name, e.g. "en0" */
  13.     } ifr_ifrn;
  14.     
  15.     union {
  16.         struct    sockaddr ifru_addr;
  17.         struct    sockaddr ifru_dstaddr;
  18.         struct    sockaddr ifru_broadaddr;
  19.         struct    sockaddr ifru_netmask;
  20.         struct sockaddr ifru_hwaddr;
  21.         short    ifru_flags;
  22.         int    ifru_ivalue;
  23.         int    ifru_mtu;
  24.         struct ifmap ifru_map;
  25.         char    ifru_slave[IFNAMSIZ];    /* Just fits the size */
  26.         char    ifru_newname[IFNAMSIZ];
  27.         void __user *    ifru_data;
  28.         struct    if_settings ifru_settings;
  29.     } ifr_ifru;
  30. };

  31. #define ifr_name    ifr_ifrn.ifrn_name    /* interface name     */
  32. #define ifr_hwaddr    ifr_ifru.ifru_hwaddr    /* MAC address         */
  33. #define    ifr_addr    ifr_ifru.ifru_addr    /* address        */
  34. #define    ifr_dstaddr    ifr_ifru.ifru_dstaddr    /* other end of p-p lnk    */
  35. #define    ifr_broadaddr    ifr_ifru.ifru_broadaddr    /* broadcast address    */
  36. #define    ifr_netmask    ifr_ifru.ifru_netmask    /* interface net mask    */
  37. #define    ifr_flags    ifr_ifru.ifru_flags    /* flags        */
  38. #define    ifr_metric    ifr_ifru.ifru_ivalue    /* metric        */
  39. #define    ifr_mtu        ifr_ifru.ifru_mtu    /* mtu            */
  40. #define ifr_map        ifr_ifru.ifru_map    /* device map        */
  41. #define ifr_slave    ifr_ifru.ifru_slave    /* slave device        */
  42. #define    ifr_data    ifr_ifru.ifru_data    /* for use by interface    */
  43. #define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index    */
  44. #define ifr_bandwidth    ifr_ifru.ifru_ivalue /* link bandwidth    */
  45. #define ifr_qlen    ifr_ifru.ifru_ivalue    /* Queue length     */
  46. #define ifr_newname    ifr_ifru.ifru_newname    /* New name        */
  47. #define ifr_settings    ifr_ifru.ifru_settings    /* Device/proto settings*/
其中便有我们需要的MAC地址,接下来通过ioctl初始化这个结构体即可,代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <sys/ioctl.h>
  8. #include <net/if.h>
  9. #include <netinet/in.h>

  10. int main(int argc , char **argv)
  11. {
  12.     int i,sockfd;
  13.     struct ifreq ifr;
  14.     char mac[30];
  15.     
  16.     sockfd=socket(AF_INET,SOCK_STREAM ,0);
  17.     if(sockfd==-1){
  18.         printf("scokfd create");
  19.         return(-1);
  20.     }
  21.     
  22.     bzero(&ifr,sizeof(ifr));
  23.     strncpy(ifr.ifr_name,"eth0",sizeof(ifr.ifr_name));
  24.     
  25.     if((ioctl(sockfd,SIOCGIFHWADDR,&ifr))<0){
  26.         printf("ioctl error\n");
  27.         return(-1);
  28.     }
  29.     
  30.     for (i=0; i<6; i++)
  31.         sprintf(mac+3*i, "%02x:", (unsigned char)ifr.ifr_hwaddr.sa_data[i]);
  32.     printf("MAC: %s \n", mac);
  33.     return(0);
  34. }

阅读(1004) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~