LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6358|回复: 18

用C语言得到本机的硬件地址

[复制链接]
发表于 2003-5-25 10:48:26 | 显示全部楼层 |阅读模式
这是我从网上找来的。


  1. /*用C语言得到本机的硬件地址 */
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/param.h>
  5. #include <sys/ioctl.h>
  6. #include <sys/socket.h>
  7. #include <net/if.h>
  8. #include <netinet/in.h>
  9. #include <net/if_arp.h>

  10. #define MAXINTERFACES 16

  11. int main(argc, argv)
  12. register int argc;
  13. register char *argv[];
  14. {
  15.     register int fd, intrface, retn = 0;
  16.     struct ifreq buf[MAXINTERFACES];
  17.     struct arpreq arp;
  18.     struct ifconf ifc;

  19.     if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
  20.         ifc.ifc_len = sizeof buf;
  21.         ifc.ifc_buf = (caddr_t) buf;
  22.         if (!ioctl(fd, SIOCGIFCONF, (char *) &ifc)) {
  23.             intrface = ifc.ifc_len / sizeof(struct ifreq);
  24.             printf("interface num is intrface=%d\n\n\n", intrface);
  25.             while (intrface-- > 0) {
  26.                 printf("net device %s\n", buf[intrface].ifr_name);

  27. /*Jugde whether the net card status is promisc*/
  28.                 if (!(ioctl(fd, SIOCGIFFLAGS, (char *) &buf[intrface]))) {
  29.                     if (buf[intrface].ifr_flags & IFF_PROMISC) {
  30.                         puts("the interface is PROMISC");
  31.                         retn++;
  32.                     }
  33.                 } else {
  34.                     char str[256];

  35.                     sprintf(str, "cpm: ioctl device %s",
  36.                             buf[intrface].ifr_name);
  37.                     perror(str);
  38.                 }

  39. /*Jugde whether the net card status is up*/
  40.                 if (buf[intrface].ifr_flags & IFF_UP) {
  41.                     puts("the interface status is UP");
  42.                 } else {
  43.                     puts("the interface status is DOWN");
  44.                 }

  45. /*Get IP of the net card */
  46.                 if (!(ioctl(fd, SIOCGIFADDR, (char *) &buf[intrface]))) {
  47.                     puts("IP address is:");
  48.                     puts(inet_ntoa
  49.                          (((struct sockaddr_in *) (&buf[intrface].
  50.                                                    ifr_addr))->sin_addr));
  51.                     puts("");
  52. //puts (buf[intrface].ifr_addr.sa_data);
  53.                 } else {
  54.                     char str[256];

  55.                     sprintf(str, "cpm: ioctl device %s",
  56.                             buf[intrface].ifr_name);
  57.                     perror(str);
  58.                 }

  59. /*Get HW ADDRESS of the net card */
  60.                 if (!(ioctl(fd, SIOCGIFHWADDR, (char *) &buf[intrface]))) {
  61.                     puts("HW address is:");

  62.                     printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
  63.                            (unsigned char) buf[intrface].ifr_hwaddr.
  64.                            sa_data[0],
  65.                            (unsigned char) buf[intrface].ifr_hwaddr.
  66.                            sa_data[1],
  67.                            (unsigned char) buf[intrface].ifr_hwaddr.
  68.                            sa_data[2],
  69.                            (unsigned char) buf[intrface].ifr_hwaddr.
  70.                            sa_data[3],
  71.                            (unsigned char) buf[intrface].ifr_hwaddr.
  72.                            sa_data[4],
  73.                            (unsigned char) buf[intrface].ifr_hwaddr.
  74.                            sa_data[5]);

  75.                     puts("");
  76.                     puts("");
  77.                 }

  78.                 else {
  79.                     char str[256];

  80.                     sprintf(str, "cpm: ioctl device %s",
  81.                             buf[intrface].ifr_name);
  82.                     perror(str);
  83.                 }
  84.             }
  85.         } else
  86.             perror("cpm: ioctl");

  87.     } else
  88.         perror("cpm: socket");

  89.     close(fd);
  90.     return retn;
  91. }
复制代码
发表于 2003-5-25 13:44:39 | 显示全部楼层
写得不错
加精吧
 楼主| 发表于 2003-5-25 14:00:52 | 显示全部楼层
特别声明一下,不是我写的。但也记不清楚是在那个网址找到的。但是觉得比较有用。所以就贴出来给大家参考一下。
发表于 2003-5-26 00:25:55 | 显示全部楼层
我记得上一次有人问类似的问题,当时没有这样的示范程序给他。
发表于 2003-5-26 16:39:07 | 显示全部楼层
我原来在中国linux论坛发过一个帖子,写法略有不同:

  1. /* Low level network programming in Linux using PF_PACKET

  2. * Need root privileges */

  3. #include <stdio.h>

  4. #include <sys/socket.h>

  5. #include <sys/errno.h>

  6. #include <linux/if.h>

  7. #include <linux/if_ether.h>

  8. #include <linux/if_arp.h>

  9. #include <linux/sockios.h>


  10. int main(int argc, char **argv)

  11. {

  12.     int i, sockfd;

  13.     static struct ifreq req;

  14.     struct sockaddr_ll inside_address;


  15.     /* Low level socket */

  16.     sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

  17.     if (sockfd < 0) {

  18.         perror("Unable to create low level socket: ");

  19.         exit(1);

  20.     }

  21.     memset(&inside_address, 0, sizeof(inside_address));

  22.     inside_address.sll_family = AF_PACKET;

  23.     inside_address.sll_protocol = htons(ETH_P_ALL);

  24.     inside_address.sll_hatype = ARPOP_REQUEST;

  25.     inside_address.sll_pkttype = PACKET_BROADCAST;

  26.     inside_address.sll_halen = 6;

  27.     strcpy(req.ifr_name, "eth1");

  28.     ioctl(sockfd, SIOCGIFINDEX, &req);

  29.     inside_address.sll_ifindex = req.ifr_ifindex;

  30.     ioctl(sockfd, SIOCGIFHWADDR, &req);

  31.     if (bind(sockfd, (struct sockaddr *) &inside_address,

  32.              sizeof(inside_address)) != 0) {

  33.         perror("Error:");

  34.         exit(1);

  35.     }

  36.     for (i = 0; i < 6; i++)

  37.         inside_address.sll_addr[i] =

  38.             (unsigned char) req.ifr_hwaddr.sa_data[i];

  39.     printf("%X\n", inside_address.sll_ifindex);

  40.     for (i = 0; i < 5; i++) {

  41.         printf("%02X", inside_address.sll_addr[i]);

  42.         printf(":");

  43.     }

  44.     printf("%02X\n", inside_address.sll_addr[i]);

  45.     close(sockfd);

  46.     return 0;

  47. }
复制代码
 楼主| 发表于 2003-5-26 18:12:33 | 显示全部楼层
看来楼上的是高手,能用原始套接字编程的人并不多见呀。
发表于 2003-5-28 13:45:14 | 显示全部楼层
看来和winodws下的C编程有许多差别呀
发表于 2003-5-28 19:40:07 | 显示全部楼层
区别也不是很大吧
因为这些socket函数是windows上也有的
发表于 2003-5-28 22:23:19 | 显示全部楼层
Windows 的那个 WinSock ,要是写一个 Unix + Windows 的程序,还要加一堆 #if,#else,#endif 什么的。
发表于 2003-5-28 22:51:22 | 显示全部楼层
有些搞不懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表