Dies könnte eine dumme Frage sein und ich entschuldige mich, wenn es hier bereits angesprochen wurde, aber ich habe ziemlich viel ohne viel Glück gesucht. Ich versuche, die Hardware-Adresse meiner Schnittstelle in C zu bekommen, und ich benutze OS X (x86-64). Ich weiß, wie man es mit ifconfig
bekommt, aber ich möchte, dass mein Programm es automatisch für jeden Computer, gut, mindestens OS X Computer bekommt. Ich habe einen anderen Thread gefunden, der diese link gepostet hat, was ziemlich genau das tut, was ich möchte (mit einigen Modifikationen), aber ich kann nicht die iokit
Funktionen Link in ld
machen (mein Compiler ist gcc
). Ich habe versucht, die Flags -lIOKit
und -framework IOKit
in die gcc
-Befehlszeile hinzuzufügen, aber ich bekomme immer noch die gleichen Link-Fehler. Hier ist ein Link zu meinem Code: header und source.MAC-Adresse von der Schnittstelle auf OS X (C)
7
A
Antwort
6
This little program wird ohne Änderungen auf OSX funktionieren.
Code: (Kredite an Alecs König von freebsd Liste)
#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;
}
Sie sollten jedoch ändern int len;
-size_t len;
+0
Danke, das ist genau das, was ich wollte. –
Ich dachte immer, dass Pavlov einen Hund hatte ... nein? –
Ja, mein Name ist nur ein Wortspiel. –