IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Récupérer MAC Adress


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 75
    Par défaut Récupérer MAC Adress
    Bonsoir,
    J'ai un petit soucis, je développe un logiciel portable sous windows et linux et je cherche à récupérer la MAC adresse d'un PC en langage C. Le code n'a pas besoin d'être générique et portable d'un coup, cela ne me gêne pas d'utiliser un code différent par OS avec des librairies différentes, pas de soucis. Le tout est de savoir lesquelles et comment ^^? Est-ce que vous auriez une idée de comment faire?????

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Solution TRES lourde en C/Windows qui utilise mon pitit projet WMI Interrogator :
    Il faut modifier la propriété à lire dans la requête WQL... et le type à lire en sortie.
    S'il y a plus simple, je suis preneur de solution également !

    Sur Linux... euh... bonne question !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Bonjour,

    Citation Envoyé par Koko33 Voir le message
    Bonsoir,
    J'ai un petit soucis, je développe un logiciel portable sous windows et linux et je cherche à récupérer la MAC adresse d'un PC en langage C. Le code n'a pas besoin d'être générique et portable d'un coup, cela ne me gêne pas d'utiliser un code différent par OS avec des librairies différentes, pas de soucis. Le tout est de savoir lesquelles et comment ^^? Est-ce que vous auriez une idée de comment faire?????
    Il n'y a pas « une mac address par PC » mais une par interface réseau, si tant est encore que le réseau en question les gère (si c'est de l'Ethernet ou assimilé, c'est le cas). Ça veut dire qu'il va d'abord falloir énumérer les différentes cartes réseau (intégrées à la carte-mère, sur un slot PCI, via une interface USB…) reliées à ta machine puis, de là, récupérer la mac address de chacune d'elles.

    Sous Linux, regarde du coté de man 7 netdevice.

    Ce sont des interfaces standard qui te permettent de contrôler la majorité des opérations réseau élémentaires à travers des ioctls. En gros, tu crées un socket quelconque sans le connecter et tu effectues ces ioctls dessus pour communiquer avec le noyau. Tous ces appels s'appuient sur le nom de l'interface pour te répondre sauf SIOCGIFNAME qui utilise le numéro d'index.

    Il te faut donc obligatoirement, pour commencer, la liste des noms des interfaces détectées et reconnues par ton noyau. Tu pourrais éventuellement passer en revue les index de 0 à n pour essayer de les trouver mais rien ne te dit qu'ils seront consécutifs et tu ne peux pas en faire l'hypothèse.

    Sous Linux, le mieux consiste à aller les chercher dans « /proc/net/dev ». Un coup de strace nous apprend que c'est ce que fait l'outil « ifconfig ».

    Une fois fait, les mac addresses sont appelées « hardware addresses ». Tu les récupères avec SIOCGIFHWADDR dans le champ ifr_hwaddr.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Et encore, une carte n'est pas exactement une interface.

    Le système pour lequel je développe actuellement possède deux ports ethernet, mais 3 interfaces, vu qu'il y a un switch interne. J'ai donc trois interfaces réseaux: eth0, wan et lan.

    Chacune a sa propre adresse MAC, que l'on vient de décider comme étant identique, histoire de ne pas trop compliquer la configuration.

  5. #5
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Sous Linux, le mieux consiste à aller les chercher dans « /proc/net/dev ». Un coup de strace nous apprend que c'est ce que fait l'outil « ifconfig ».

    Une fois fait, les mac addresses sont appelées « hardware addresses ». Tu les récupères avec SIOCGIFHWADDR dans le champ ifr_hwaddr.
    Il y a plus simple, beaucoup plus simple
    Il suffit de passer par le système de fichier virtuel sysfs.
    C’est un système de fichier virtuel très utile, qui regorge d’info. Un peu comme procfs.

    Donc, via sysfs, dans le répertoire /sys/class/net/ tu as un répertoire (lien symbolique en fait) par interface.
    Et chaque répertoire contient un fichier address qui contient l’adresse MAC associé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ ls /sys/class/net/       
    eth0  lo  wlan0
    $ ls /sys/class/net/lo
    addr_assign_type  addr_len   carrier  dormant  flags    ifindex  link_mode  netdev_group  power   speed       subsystem     type
    address           broadcast  dev_id   duplex   ifalias  iflink   mtu        operstate     queues  statistics  tx_queue_len  uevent
    $ cat /sys/class/net/lo/address
    00:00:00:00:00:00
    Bon lo étant la boucle locale, c’est normale d’avoir 0 partout. Mais les autres contiennent de vrai adresses MAC.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Oui, je sais ! :-)

    C'est même par là que je voulais commencer mais il se faisait tard et comme je n'arrivais plus à trouver le chemin exact, j'ai laissé tomber pour ce moment-là.

    C'est une très bonne chose de l'avoir mentionné, donc, mais sysfs a l'inconvénient de ne pas toujours être disponible et de n'exister que depuis les noyaux 2.6. En outre, ses premières versions ont fait l'objet de plusieurs remaniements. Bon, on en est au 3.10 désormais, donc les 2.4 commencent à être vraiment loin. Par contre, s'il s'agit de compiler des logiciels pour des systèmes déjà en production, ça peut avoir de l'importance.

    Les ioctl ci-dessus, eux, sont plus ou moins standard et fonctionnent pratiquement depuis le début. Ils ont également l'énorme avantage d'être portables sur la plupart des autres UNIX, comme Solaris et, dans une certaine mesure, les BSD. Par contre, après vérif', OpenBSD utilise SIOCGLIFPHYADDR. Même méthode, donc, mais interface légèrement différente…

  7. #7
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Je plussoie Obsidian : sur les BSD il n'y a pas toujours de procfs "de base" (c'est à ajouter)...
    La méthode ioctl() est vraiment la plus "UNIX-friendly".
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #8
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Je plussoie Obsidian : sur les BSD il n'y a pas toujours de procfs "de base" (c'est à ajouter)...
    La méthode ioctl() est vraiment la plus "UNIX-friendly".
    Je suis bien d’accord, mais même les ioctl ne sont pas portable (les noms des constantes sont rarement les mêmes). Donc bon, dans le cas présent la différence est mineure (et Koko33 est pas contre avoir un code par système), donc autant allez au plus simple

    Dans le cas général, je suis tout à fait d’accord avec vous

    Sinon en moyen portable il y a peut-être la libpcap (à vérifier), mais ça ajoute une dépendance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] Récupérer l'adresse MAC de la machine
    Par la.musaraigne dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 27/01/2011, 14h08
  2. récupérer une adresse mac d'un pc distant
    Par Mut dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 03/02/2006, 11h01
  3. [Ada 95] Récupérer l'adresse MAC de la machine
    Par kindool dans le forum Ada
    Réponses: 3
    Dernier message: 26/05/2005, 15h49
  4. [MFC]récupérer l'adresse MAC
    Par julien20vt dans le forum MFC
    Réponses: 6
    Dernier message: 17/02/2004, 11h22
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo