GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir l'adresse MAC de votre machine à l'aide d'un programme C ?

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 .


Linux
  1. Comment changer l'adresse MAC en utilisant macchanger sur Kali Linux

  2. Comment être anonyme sur le protocole IPv6 en n'utilisant pas l'adresse Mac dans EUI-64 ?

  3. Comment ajouter une adresse IP sur Ubuntu 18.04 en utilisant netplan ?

  4. Comment obtenir une adresse mémoire spécifique en utilisant C

  5. Obtenir l'adresse MAC à l'aide du script shell

Comment changer l'adresse MAC sur Ubuntu 20.04 en utilisant Macchanger

Comment changer l'adresse MAC du réseau sous Linux

Comment changer l'adresse MAC sous Linux

Comment obtenir votre adresse IP sous Linux

Comment bloquer une adresse IP en utilisant .htaccess ?

Comment obtenir les spécifications matérielles de votre système à l'aide de lshw Hardware Lister