- 论坛徽章:
- 0
|
如何在FreeBSD下实现获取MAC地址?谢谢
这是修改后的程序,我在FreeBSD 4.4-RELEASE下编译运行成功
int ip2mac(u_long target_ip, unsigned char* target_mac){
int s, mib[6];
size_t len;
int i=0,j=0;
char *buf;
struct rt_msghdr *rtm;
struct sockaddr_inarp *sin;
struct sockaddr_dl *sdl;
u_long tmp_ip;
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;
mib[4] = NET_RT_FLAGS;
mib[5] = RTF_LLINFO;
if(sysctl(mib, 6, NULL, &len, NULL, 0) < 0)return 0;
if((buf = (char*)malloc(len)) == NULL)return 0;
printf("len = %d\n", len);
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0){
free(buf);return 0;
}
for(s = 0; s < len; s+= rtm->;rtm_msglen){
rtm = (struct rt_msghdr *)(buf + s);
printf("%d\n", rtm->;rtm_msglen);
sin = (struct sockaddr_inarp *)(rtm + 1);
//sdl = (struct sockaddr_dl *)((char*)sin+1);
sdl = (struct sockaddr_dl *)(sin+1);
//printf("%s\n",inet_ntoa(sin->;sin_addr));
tmp_ip=(u_long)(sin->;sin_addr.s_addr);
if(target_ip==tmp_ip){
memset(target_mac, 0, sizeof(target_mac));
//bcopy((char *)LLADDR(sdl), target_mac, 6);
//bcopy(target_mac,(char *)LLADDR(sdl),6);
strcpy(target_mac,link_ntoa(sdl));
free(buf);
return 1;
}
}
free(buf);
return 0;
}
main(int argc,char* argv[]){
unsigned char macstr[256];
if(argc==1){
printf("Usage:\tip2mac sourceIP\n" ;
return;
}
memset(macstr,0,256);
if(ip2mac(inet_addr(argv[1]),macstr)){
printf("%s\n",macstr);
}
else printf("error\n" ;
} |
|