Questa potrebbe essere una domanda stupida e mi scuso se è già stato risolto qui, ma ho cercato un po 'senza molta fortuna. Sto cercando di ottenere l'indirizzo hardware della mia interfaccia in C e sto usando OS X (x86-64). So come ottenerlo con ifconfig
, ma voglio che il mio programma lo ottenga automaticamente per qualsiasi computer, beh, almeno per i computer OS X. Ho trovato un altro thread che ha pubblicato questo link che praticamente fa quello che voglio (con alcune modifiche), ma non posso fare il collegamento delle funzioni iokit
in ld
(il mio compilatore è gcc
). Ho provato ad aggiungere le flag -lIOKit
e -framework IOKit
alla riga di comando gcc
, ma ottengo ancora gli stessi errori di collegamento. Ecco un collegamento al mio codice: header e source.Indirizzo MAC dall'interfaccia su OS X (C)
7
A
risposta
6
This little program funzionerà senza modifiche su OSX.
Codice: (crediti a Alecs re da lista FreeBSD)
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int mib[6], len;
char *buf;
unsigned char *ptr;
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
if (argc != 2) {
fprintf(stderr, "Usage: getmac <interface>\n");
return 1;
}
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_LINK;
mib[4] = NET_RT_IFLIST;
if ((mib[5] = if_nametoindex(argv[1])) == 0) {
perror("if_nametoindex error");
exit(2);
}
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
perror("sysctl 1 error");
exit(3);
}
if ((buf = malloc(len)) == NULL) {
perror("malloc error");
exit(4);
}
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
perror("sysctl 2 error");
exit(5);
}
ifm = (struct if_msghdr *)buf;
sdl = (struct sockaddr_dl *)(ifm + 1);
ptr = (unsigned char *)LLADDR(sdl);
printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *ptr, *(ptr+1), *(ptr+2),
*(ptr+3), *(ptr+4), *(ptr+5));
return 0;
}
Si dovrebbe, tuttavia, cambiare int len;
-size_t len;
+0
Grazie, è esattamente quello che volevo. –
Problemi correlati
- 1. JNotify su Mac OS X?
- 2. Disinstallare MongoDB su Mac OS X
- 3. Imparare ASP.NET MVC su Mac OS X
- 4. Sviluppo Symbian C++ con Mac OS X
- 5. Installare CLSQL su Mac OS X
- 6. Installare libpq-dev su Mac OS X
- 7. È possibile eseguire un'applicazione C#/WPF su Mac OS X?
- 8. C++ 11 con Xcode su Mac OS X Snow Leopard
- 9. Test unità C#/Mono su Mac OS X
- 10. Compilare C++ con SWIG su Mac OS X
- 11. GUI Java Swing su Mac OS X
- 12. Come installo wxPython su Mac OS X?
- 13. console EFI su Mac OS X (Intel)
- 14. Impossibile installare matplotlib su Mac OS X
- 15. Test IE6 su Mac OS X
- 16. Comando servizi su Mac OS X
- 17. Installa/aggiorna gradle su Mac OS X
- 18. Come installare mod_jk su Mac OS X
- 19. Come configurare libusb su Mac OS X?
- 20. Gdb su Mac OS X v10.7 (Lion)
- 21. Nessun dispositivo Java su Mac OS X
- 22. FreeGLUT su Mac OS X Lion
- 23. Git core.editor su Mac OS X
- 24. Problema con Virtualenv su Mac OS X
- 25. Impossibile visualizzare SWT su Mac OS X
- 26. Architettura dell'applicazione Cocoa su Mac OS X
- 27. Correre ddd su Mac OS X 10.7.5
- 28. Aggiornamento errore Brew su Mac OS X
- 29. Autorizzazioni XAMPP su Mac OS X?
- 30. Errore Apache su Mac OS X Lion
ho sempre pensato che Pavlov aveva un cane ... no? –
Sì, il mio nome è solo un gioco di parole. –