Comment convertir une adresse MAC en adresse IP correspondante?

Je recherche un moyen simple de convertir une adresse MAC en adresse IP correspondante sur un réseau local. Dans mon cas, il n’y a que deux périphériques: un PC très normal (192.168.0.1) et un instrument scientifique qui a une adresse IP arbitraire (192.168.0.xxx) codée en dur dans sa ROM. Le PC et l’instrument sont directement connectés via une prise UDP avec un câble CAT5.

Je connais l’adresse MAC de l’instrument, mais supposons que son adresse IP soit inconnue. Je voudrais écrire une application C / C ++ qui parle avec l’instrument en utilisant une connexion socket. Mais j’ai besoin de connaître l’adresse IP avant d’ouvrir un socket (WinSock sous Windows, sys / socket sous OS X et Linux).

Actuellement, j’utilise une manière très sale, comme indiqué ci-dessous.

  1. Exécutez la commande ping 192.168.0.2 (REMARQUE: l’instrument ne répond pas au ping ).
  2. Répétez cette opération de 192.168.0.2 à 192.168.0.255
  3. Exécutez arp -a pour imprimer une liste d’adresses IP et MAC
  4. Recherchez l’adresse MAC connue et l’adresse IP correspondante dans la liste.

J’aimerais savoir comment récupérer l’adresse IP de manière plus sophistiquée. Ce sera très bien si je peux utiliser la même méthode sur des machines Mac, Linux et Windows.

Autant que je sache, je dois diffuser un paquet ARP sur le réseau afin de récupérer une adresse MAC à partir d’une adresse IP connue. Mais je ne pouvais pas trouver un moyen d’obtenir une adresse IP à partir d’une adresse MAC.

Il n’y a pas de bonne solution générique pour cela car c’est l’inverse du comportement souhaité. Les protocoles de niveau inférieur ne sont pas censés avoir besoin de connaître les protocoles de couche supérieure. Par conséquent, les opérations sur la couche MAC ne permettent pas de connaître les adresses IP. Et puis vous entrez dans la situation dans laquelle vous vous trouvez. Ainsi, vous pouvez soit utiliser un hack que le code que vous avez déjà, ou vous pouvez le résoudre depuis une autre direction. Existe-t-il un moyen non codé de déterminer l’adresse IP du périphérique avant de commencer? Tels que le définir explicitement ou le placer dans un fichier de configuration pour votre application. Sinon, le périphérique peut-il envoyer des requêtes ARP parasites? Le PC doit mettre à jour son cache ARP en fonction des demandes entrantes ainsi que des réponses aux demandes qu’il a formulées.

Nous avons dû le faire il y a un certain temps, mais je ne pense pas que cela fonctionne correctement.

Je n’ai pas les appels d’API sous la main, mais ils sont faciles à trouver dans l’API Windows. C’est ce que nous avons utilisé afin que notre solution ne soit pas portable sur des systèmes autres que Windows.

Dans notre cas, nous avons rencontré le même obstacle – pas de traduction facile. En fin de compte, nous avons dû obtenir une liste de toutes les cartes réseau disponibles, puis les parcourir en essayant de faire correspondre notre adresse MAC donnée à l’adresse MAC obtenue à partir de la structure de la carte réseau.

Une fois que nous avons trouvé une correspondance, nous avons recherché l’adresse IP atsortingbuée à la structure de la carte réseau.

Nous avons continué à aller voir si nous avions trouvé d’autres correspondances pour pouvoir enregistrer une erreur. C’est une bonne chose que nous ayons fait, car je crois que nous l’avons trouvé plusieurs fois, et que ce n’était pas dû à une adresse MAC clonée.

C’est à ce moment-là que nous avons appris que le problème serait encore plus difficile et nous avons décidé de tout abandonner pour ne conserver que les adresses IP.

Pourquoi ne pas essayer la commande système arp dans c ++

 system("arp"); 

Cela vous donne une table de traduction IP-MAC.