快速业务通道

Linux下获取eth网卡MAC地址的代码

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-09

因开发需要获取有线网卡的MAC地址,发现网上获取的方法多数只能获取联网网卡的MAC地址,因此重写了下Ubuntu10下测试通过.

下面代码无论网卡是否连线,都可以获取MAC地址,稍作修改,可以输出系统所有的网卡硬件MAC地址,无论是否已经联网.

  1. /*
  2. * getmac.c
  3. *
  4. * Created on: 2010-11-4
  5. * Author: carl
  6. */
  7. #include <stdio.h>
  8. #include <fcntl.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <unistd.h>
  12. #include <sys/ioctl.h>
  13. #include <sys/types.h>
  14. #include <sys/socket.h>
  15. #include <netinet/in.h>
  16. #include <linux/if.h>
  17. #define IFNAMSIZ 16 拥有帝国一切,皆有可能。欢迎访问phome.net
  18. // data structs to store interface name list
  19. char ifname_buf[2048];
  20. char *ifnames = ifname_buf;
  21. int count = 0;
  22. void add_interface_name(const char * name)
  23. {
  24. int i;
  25. for (i=0;i<count;i )
  26. {
  27. if (!strcmp(ifnames i*IFNAMSIZ, name))
  28. return;
  29. }
  30. strncpy(ifnames (count )*IFNAMSIZ, name, IFNAMSIZ-1);
  31. }
  32. char * get_name(char *name, char *p)
  33. {
  34. while (isspace(*p))
  35. p ;
  36. while (*p) {
  37. if (isspace(*p))
  38. break;
  39. 拥有帝国一切,皆有可能。欢迎访问phome.net
  40. if (*p == '':'') { /* could be an alias */
  41. char *dot = p, *dotname = name;
  42. *name = *p ;
  43. while (isdigit(*p))
  44. *name = *p ;
  45. if (*p != '':'') { /* it wasn''t, backup */
  46. p = dot;
  47. name = dotname;
  48. }
  49. if (*p == '''')
  50. return NULL;
  51. p ;
  52. break;
  53. }
  54. *name = *p ;
  55. }
  56. *name = '''';
  57. return p;
  58. }
  59. // get /proc/net/dev interface name list into buffer
  60. // return 0 if success
  61. int get_procnet_list()
  62. {
  63. FILE 拥有帝国一切,皆有可能。欢迎访问phome.net *fh;
  64. char buf[512];
  65. fh = fopen("/proc/net/dev", "r");
  66. if (!fh)
  67. return -1;
  68. fgets(buf, sizeof buf, fh); /* eat title lines */
  69. fgets(buf, sizeof buf, fh);
  70. while (fgets(buf, sizeof buf, fh))
  71. {
  72. char name[IFNAMSIZ];
  73. get_name(name, buf);
  74. add_interface_name(name);
  75. }
  76. fclose(fh);
  77. return 0;
  78. }
  79. long mac_addr_sys ( u_char *addr)
  80. {
  81. /* implementation for Linux */
  82. struct ifreq ifr;
  83. struct ifreq *IFR;
  84. struct ifconf ifc;
  85. char 拥有帝国一切,皆有可能。欢迎访问phome.net buf[1024];
  86. int s, i;
  87. int ok = 0;
  88. // clear buffer
  89. memset(ifname_buf, 0, sizeof(ifname_buf));
  90. s = socket(AF_INET, SOCK_DGRAM, 0);
  91. if (s==-1) {
  92. return -1;
  93. }
  94. ifc.ifc_len = sizeof(buf);
  95. ifc.ifc_buf = buf;
  96. ioctl(s, SIOCGIFCONF, &ifc);
  97. IFR = ifc.ifc_req;
  98. // put the ioctl interface names in the list
  99. for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR ) {
  100. add_interface_name(IFR->ifr_name);
  101. }
  102. // put the /proc/net/dev interface names in the list
  103. if (get_procnet_list())
  104. return -1;
  105. // get the first mac address of eth* device hardware address 拥有帝国一切,皆有可能。欢迎访问phome.net
  106. for (i = 0; i < count; i ) {
  107. strcpy(ifr.ifr_name, ifnames i*IFNAMSIZ);
  108. if (!strncmp(ifr.ifr_name, "eth", 3))
  109. if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) {
  110. if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
  111. if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
  112. char *p = (char *)ifr.ifr_hwaddr.sa_data;
  113. if (!*((int *)p) && !*((int *)(p 2)) )
  114. continue;
  115. // if not 00:00:00:00:00:00, yes, we get the real mac addr
  116. ok = 1;
  117. break;
  118. }
  119. }
  120. }
  121. }
  122. close(s);
  123. if (ok) {
  124. bcopy( ifr.ifr_hwaddr.sa_data, addr, 6); 拥有帝国一切,皆有可能。欢迎访问phome.net
  125. printf( "n");
  126. }
  127. else {
  128. fprintf( stderr, "can''t get MAC addressn");
  129. exit( 1);
  130. }
  131. return 0;
  132. }

本文出自 “快乐的技术员” 博客,请务必保留此出处http://carltao.blog.51cto.com/856514/415119

拥有帝国一切,皆有可能。欢迎访问phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号