MAC address

Iniciado por <<<-Basura->>>, 18 Septiembre 2011, 20:49 PM

0 Miembros y 1 Visitante están viendo este tema.

<<<-Basura->>>

Hola estuve googleando XD y no he conseguido nada así que pregunto aquí, me podrían ayudar, es que ando buscando cual función es capaz de devolverme la MAC address de mi NIC, en C
<<<--Basura-->>>

madpitbull_99

Hay varios métodos, los que menciono funcionan en Windows, desconozco si en las demás plataformas también.

1.) Con el comando getmac, se la pasas a la función system() y después parseas el resultado.

2.) Mediante WinAPI. Usando NDIS [Ethernet]. Otro tema similar: Get Mac Address.





«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

El_Java

En Ubuntu puedes usar "sudo iwconfig" o "sudo ifconfig 'nombre interfaz' | grep HW", pero claro, tienes que sacar de ahi la info que te interese

<<<-Basura->>>

es que estoy leyendo y digamos con los sockets puedes crear paquetes y hay funciones para obtener tu dirección IP también, pero lo que andaba buscando era una función para obtener la dirección MAC, si se puede para linux :S,

Sin tener que llamar al system
<<<--Basura-->>>

madpitbull_99

No hay ninguna función que devuelva directamente la dirección MAC. Tienes que hacerlo por tu cuenta.

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

int main()
{
    ifreq ifr;
    ifconf ifc;
    char buf[1024];
    int success = 0;

    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (sock == -1) { /* handle error*/ };

    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = buf;
    if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ }

    ifreq* it = ifc.ifc_req;
    const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq));

    for (; it != end; ++it) {
        strcpy(ifr.ifr_name, it->ifr_name);
        if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
            if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
                if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
                    success = 1;
                    break;
                }
            }
        }
        else { /* handle error */ }
    }

    unsigned char mac_address[6];

    if (success) memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
}


Éste es otro ejemplo:

#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netdb.h>
#include <stdio.h>

int main()
{
  struct ifreq s;
  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

  strcpy(s.ifr_name, "eth0");
  if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
    int i;
    for (i = 0; i < 6; ++i)
      printf(" %02x", (unsigned char) s.ifr_addr.sa_data[i]);
    puts("\n");
    return 0;
  }
  return 1;
}


Los he sacado todos de StackOverflow:

_How to get MAC address of your machine using a C program?
_How to get mac address for an interface in linux using a C Program?
_Detecting MAC Address using C application




«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

<<<-Basura->>>

madpitbull_99 aunque no lo hayas hecho tu, encontraste algo que yo había buscado durante días eres de gran ayuda  :D
<<<--Basura-->>>