> 问答

LINUX下获取IP地址和MAC地址

人阅读 2024-10-17 05:06:26Linux
广告 X
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

  #include <stdio.h>

  #include <sys/types.h>

  #include <sys/param.h>#include <sys/ioctl.h>

  #include <sys/socket.h>

  #include <net/if.h>

  #include <netinet/in.h>

  #include <net/if_arp.h>#ifdef SOLARIS

  #include <sys/sockio.h>

  #endif#define MAXINTERFACES   16main (argc, argv)

  register int argc;

  register char *argv[];

  {

  register int fd, intrface, retn = 0;

  struct ifreq buf[MAXINTERFACES];

  struct arpreq arp;

  struct ifconf ifc;if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0)

  {

  ifc.ifc_len = sizeof buf;

  ifc.ifc_buf = (caddr_t) buf;

  if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc))

  {

  //获取接口信息

  intrface = ifc.ifc_len / sizeof (struct ifreq);

  printf("interface num is intrface=%d\n\n\n",intrface);

  //根据借口信息循环获取设备IP和MAC地址

  while (intrface-- > 0)

  {

  //获取设备名称

  printf ("net device %s\n", buf[intrface].ifr_name);

  //判断网卡类型

  if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface])))

  {

  if (buf[intrface].ifr_flags & IFF_PROMISC)

  {

  puts ("the interface is PROMISC");

  retn ;

  }

  }

  else

  {

  char str[256];      sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);

  perror (str);

  }    //判断网卡状态

  if (buf[intrface].ifr_flags & IFF_UP)

  {

  puts("the interface status is UP");

  }

  else

  {

  puts("the interface status is DOWN");

  }    //获取当前网卡的IP地址

  if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))

  {

  puts ("IP address is:");

  puts(inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr));

  puts("");

  //puts (buf[intrface].ifr_addr.sa_data);

  }

  else

  {

  char str[256];   sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);

  perror (str);

  }

  /* this section can't get Hardware Address,I don't know whether the reason is module driver*/

  #ifdef SOLARIS

  //获取MAC地址

  arp.arp_pa.sa_family = AF_INET;

  arp.arp_ha.sa_family = AF_INET;

  ((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr.s_addr;

  if (!(ioctl (fd, SIOCGARP, (char *) &arp)))

  {

  puts ("HW address is:");     //以十六进制显示MAC地址

  printf("x:x:x:x:x:x\n",

  (unsigned char)arp.arp_ha.sa_data[0],

  (unsigned char)arp.arp_ha.sa_data[1],

  (unsigned char)arp.arp_ha.sa_data[2],

  (unsigned char)arp.arp_ha.sa_data[3],

  (unsigned char)arp.arp_ha.sa_data[4],

  (unsigned char)arp.arp_ha.sa_data[5]);     puts("");

  puts("");

  }

  #else

  #if 0

  /*Get HW ADDRESS of the net card */

  if (!(ioctl (fd, SIOCGENADDR, (char *) &buf[intrface])))

  {

  puts ("HW address is:");     printf("x:x:x:x:x:x\n",

  (unsigned char)buf[intrface].ifr_enaddr[0],

  (unsigned char)buf[intrface].ifr_enaddr[1],

  (unsigned char)buf[intrface].ifr_enaddr[2],

  (unsigned char)buf[intrface].ifr_enaddr[3],

  (unsigned char)buf[intrface].ifr_enaddr[4],

  (unsigned char)buf[intrface].ifr_enaddr[5]);     puts("");

  puts("");

  }

  #endif

  if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface])))

  {

  puts ("HW address is:");     printf("x:x:x:x:x:x\n",

  (unsigned char)buf[intrface].ifr_hwaddr.sa_data[0],

  (unsigned char)buf[intrface].ifr_hwaddr.sa_data[1],

  (unsigned char)buf[intrface].ifr_hwaddr.sa_data[2],

  (unsigned char)buf[intrface].ifr_hwaddr.sa_data[3],

  (unsigned char)buf[intrface].ifr_hwaddr.sa_data[4],

  (unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]);     puts("");

  puts("");

  }

  #endif      else

  {

  char str[256];   sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);

  perror (str);

  }

  } //while

  } else

  perror ("cpm: ioctl");   } else

  perror ("cpm: socket");    close (fd);

  return retn;

  }编译:gcc 文件名即可

关键词标签:LINUX

LOT物联网

iot产品 iot技术 iot应用 iot工程

Powered By LOT物联网  闽ICP备2024036174号-1

联系邮箱:support1012@126.com