Beaucoup plus agréable que toute cette folie de socket ou de shell utilise simplement sysfs pour cela :
le fichier /sys/class/net/eth0/address
porte votre adresse mac sous forme de chaîne simple que vous pouvez lire avec fopen()
/fscanf()
/fclose()
. Rien de plus facile que ça.
Et si vous souhaitez prendre en charge d'autres interfaces réseau que eth0 (et vous le souhaitez probablement), utilisez simplement opendir()
/readdir()
/closedir()
le /sys/class/net/
.
Vous devez parcourir toutes les interfaces disponibles sur votre machine et utiliser ioctl
avec SIOCGIFHWADDR
drapeau pour obtenir l'adresse mac. L'adresse mac sera obtenue sous la forme d'un tableau binaire de 6 octets. Vous souhaitez également ignorer l'interface de bouclage.
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
int main()
{
struct ifreq ifr;
struct 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 */ }
struct ifreq* it = ifc.ifc_req;
const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct 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);
}
Vous souhaitez consulter la page de manuel de getifaddrs(3). Il y a un exemple en C dans la page de manuel elle-même que vous pouvez utiliser. Vous voulez obtenir l'adresse avec le type AF_LINK
.