Page 1 of 1

MAC-Adresse ermitteln wenn eth nicht verbunden?

Posted: 22. Jul 2011 8:03
by ElBlues
Hi,

aktuell ermittle ich die MAC-Adressen meiner vorhandenen Netzwerkgeräte auf diesem Weg:

Code: Select all

s = socket(AF_INET, SOCK_DGRAM, 0);
if (s==-1) return false;

ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(s, SIOCGIFCONF, &ifc);
 
IFR = ifc.ifc_req;
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) 
{
   strcpy(ifr.ifr_name, IFR->ifr_name);
   if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) 
   {
      if (! (ifr.ifr_flags & IFF_LOOPBACK)) 
      {
         if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0)
         {
            bcopy(ifr.ifr_hwaddr.sa_data,m,6);
            ...
         }
      }
   }
}
close(s);
Nachteil: hier muss - vermutlich Dank NetworkManager - ein Netzwerkinterface tatsächlich verbunden sein, damit es in der Liste auftaucht.

Ich hätte aber gerne die MAC-Adressen aller Interfaces, egal ob verbunden oder nicht. Wie geht das am besten?

Posted: 22. Jul 2011 9:55
by Janka
Vermutlich hängt das damit zusammen, dass ein AF_INET-Socket voraussetzt, dass dem Gerät eine IP-Adresse zugewiesen ist. Andere Protokollfamilie ausprobieren, z.B. raw-Sockets.

Ich mache das übrigens ganz anders und gucke mir einfach den Inhalt der Dateien /sys/class/net/eth*/address an. Geht natürlich nur, wenn sysfs da ist.

Janka

Posted: 27. Jul 2011 6:52
by ElBlues
Janka wrote:Ich mache das übrigens ganz anders und gucke mir einfach den Inhalt der Dateien /sys/class/net/eth*/address an. Geht natürlich nur, wenn sysfs da ist.
Das klingt doch mal nach einer prima Lösung - und wenn sysfs nicht existiert kann ich immer noch auf meine Methode zurückgreifen :-)