Я пытаюсь получить MAC-адреса всех своих интерфейсов в OSX, используя C. Обычные способы получить его Linux не работают в BSD — из всего, что я видел, вы должны получить интерфейсы и искать те, которые относятся к типу AF_LINK. Моя проблема в том, что LLADDR(sockaddr_dl) дает мне целую кучу данных (включая мой MAC), и я не знаю, в каком формате находятся данные. Например; будет выводиться следующий код:
Устройство: ссылка en1 sdl_alen: 101 mac: 31:f8:1e:df:d6:22:1d:00:00:00:00:00:00:00:00:00:00: 00:00:00:00:00:b0:06:10:00:01:00:00:00:c0:02:10:00:01:00:00:00:00:00:00:00: 00:00:00:00:40 :03:10:00:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00: 00:03:00:6c:6f:30:00:00:00:00:00:00:00:00:00:00:00:00:00:70:03:10:00:01:00: 00:00:e0: 02:10:00:01:00:00:
Мой MAC выделен жирным шрифтом. Кажется, что это формат все время, но мне было бы намного удобнее, если бы я мог привести LLADDR(sockaddr_dl) к чему-то. В net/if_dl.h LLADDR определяется как:
#define LLADDR(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen))
который, насколько я могу судить, говорит, что результаты имеют тип (void *) - не помогает.
Другие сообщения, такие как:
кажется, что они разобрались, но если вы посмотрите код, вы увидите, что он не будет работать из-за того, что sdl_alen не равен 6.
int main() {
pcap_if_t *alldevs;
pcap_if_t *d;
pcap_addr_t *alladdrs;
pcap_addr_t *a;
struct sockaddr_dl* link;
char eb[PCAP_ERRBUF_SIZE];
char *addr_buf[40];
if (pcap_findalldevs(&alldevs, eb) == -1) {
printf("no devs found\n");
return(-1);
}
for (d = alldevs; d != NULL; d = d->next) {
printf("Device: %s\n", d->name);
alladdrs = d->addresses;
for (a = alladdrs; a != NULL; a = a->next) {
if(a->addr->sa_family == AF_LINK && a->addr->sa_data != NULL){
// MAC ADDRESS
//struct sockaddr_dl *sdl = (struct sockaddr_dl *) a->addr->sa_data;
link = (struct sockaddr_dl*)a->addr->sa_data;
char mac[link->sdl_alen];
caddr_t macaddr = LLADDR(link);
memcpy(mac, LLADDR(link), link->sdl_alen);
printf("link sdl_alen: %i\n", link->sdl_alen);
int i;
printf("mac: ");
for(i = 0; i<link->sdl_alen; i++){
printf("%02x:", (unsigned char)mac[i]);
}
printf("\n");
}
}
}
}