jak zjiskat MAC v C

Jaroslav Snajdr jarda na tinysoftware.com
Pondělí Březen 13 14:02:59 CET 2000


Roman Pavera wrote:

> potrebuji zjistit MAC adresu sitoveho zarizeni v C/C++ (ten
> program nebezi pod rootem). Koukal jsem na zdrojaky arp, ale
> moc z toho moudry nejsem.

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <net/if.h>

int main(int argc, char *argv[])
{
  /* struktura, ktera je parametrem pro ioctl. Definice viz net/if.h */
  struct ifreq ifr;

  int sock;
  unsigned char *ptr;

  if (argc != 2) {
    printf("Usage: %s [interface name]\n", argv[0]);
    exit(1);
  }

  /* jmeno zarizeni muze mit max. 15 znaku */
  if (strlen(argv[1]) >= IFNAMSIZ) {
    printf("Interface name too large\n");
    exit(1);
  }

  /* sitova zarizeni se ovladaji pres socket, protoze nemaji
   * zadny soubor v /dev
   */
  if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("Cannot create socket");
    exit(1);
  }

  /* Zkopirujeme jmeno zarizeni do ifr */
  strcpy(ifr.ifr_name, argv[1]);

  /* A zavolame ioctl */
  if (ioctl(sock, SIOCGIFHWADDR, &ifr) != 0) {
    perror("ioctl() failed");
    close(sock);
    exit(1);
  }

  /* Nakonec vypiseme ziskanou adresu. Tohle funguje spravne jen
   * pro ethernetove adresy, na jine typy hardware se podivejte
   * do zdrojaku ifconfigu.
   */
  ptr = ifr.ifr_hwaddr.sa_data;
  printf("HW Address: %02X:%02X:%02X:%02X:%02X:%02X\n",
	 ptr[0] & 0xff, ptr[1] & 0xff, ptr[2] & 0xff,
	 ptr[3] & 0xff, ptr[4] & 0xff, ptr[5] & 0xff);                       

  close(sock);

  return 0;
}

-jns


Další informace o konferenci Linux