Đây có thể là một câu hỏi ngu ngốc và tôi xin lỗi nếu nó đã được giải quyết ở đây, nhưng tôi đã tìm kiếm khá nhiều mà không có nhiều may mắn. Tôi đang cố gắng để có được địa chỉ phần cứng giao diện của tôi trong C và tôi đang sử dụng OS X (x86-64). Tôi biết làm thế nào để có được nó với ifconfig
, nhưng tôi muốn chương trình của tôi để có được nó tự động cho bất kỳ máy tính, tốt, ít nhất là OS X máy tính. Tôi tìm thấy một chủ đề được đăng link này mà khá nhiều những gì tôi muốn (với một số sửa đổi), nhưng tôi không thể làm cho các liên kết chức năng iokit
trong ld
(trình biên dịch của tôi là gcc
). Tôi đã thử thêm các cờ -lIOKit
và -framework IOKit
vào dòng lệnh gcc
, nhưng tôi vẫn gặp lỗi liên kết tương tự. Đây là liên kết đến mã của tôi: header và source.Địa chỉ MAC từ giao diện trên OS X (C)
7
A
Trả lời
6
This little program sẽ hoạt động mà không có thay đổi trên OSX.
Code: (tín dụng cho Alecs vua ra khỏi danh sách 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;
}
Bạn nên, tuy nhiên, thay đổi int len;
-size_t len;
+0
Cảm ơn, đó là chính xác những gì tôi muốn. –
Tôi luôn luôn nghĩ rằng Pavlov đã có một con chó ... không? –
Vâng, tên tôi chỉ là một trò chơi chữ. –