精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>开发相关>>Re:在FreeBSD下怎么编程得到网卡MAC地址?

主题:Re:在FreeBSD下怎么编程得到网卡MAC地址?
发信人: stevensli()
整理人: zhcharles(2002-01-30 16:02:16), 站内信件
【 在 whnova 的大作中提到:】
:【 在 stevensli 的大作中提到:】
::【 在 whnova 的大作中提到:】
:::在Linux下可以用ioctl(fd, SIOCGIFHWADDR, &ifr);但是在FreeBSD下没有SIOCGIFHWADDR,而且FreeBSD的struct ifreq里面也没有象Linux的ifreq里面的struct sockaddr ifru_hwaddr;,那么在FreeBSD里面该怎么用ioctl获取网卡的MAC地址呢?别告诉让我看ifconfig.c哦。
:::......
:: 
:
:......
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
struct ifaddrs *ifa,*curifa;
struct sockaddr_in addr;
struct sockaddr_dl dladdr;
char paddr[256];
u_char pdladdr[16];
int i;

if(getifaddrs(&ifa)<0)
{
perror("getifaddrs error");
exit(127);
}
for(curifa=ifa;curifa!=NULL;curifa=curifa->ifa_next)
{
if(curifa->ifa_addr->sa_family==AF_INET)
{
printf("%s: < ",curifa->ifa_name);
if(curifa->ifa_flags&IFF_UP)
printf("UP ");
if(curifa->ifa_flags&IFF_BROADCAST)
printf("BCAST ");
if(curifa->ifa_flags&IFF_MULTICAST)
printf("MCAST ");
if(curifa->ifa_flags&IFF_LOOPBACK)
printf("LOOP ");
if(curifa->ifa_flags&IFF_POINTOPOINT)
printf("P2P ");
printf(">\n");
memcpy(&addr,curifa->ifa_addr,sizeof(struct sockaddr_in));
printf("\tIP addr:%s\n",
inet_ntop(AF_INET,&addr.sin_addr,paddr,sizeof(paddr)));
memcpy(&addr,curifa->ifa_netmask,sizeof(struct sockaddr_in));
printf("\tnetmask: %s\n",
inet_ntop(AF_INET,&addr.sin_addr,paddr,sizeof(paddr)));
memcpy(&addr,curifa->ifa_broadaddr,sizeof(struct sockaddr_in));
printf("\tbroadaddr: %s\n",
inet_ntop(AF_INET,&addr.sin_addr,paddr,sizeof(paddr)));
//printf("\tflags=%d\n",curifa->ifa_flags);
}
if(curifa->ifa_addr->sa_family==AF_LINK)
{
memcpy(&dladdr,curifa->ifa_addr,sizeof(struct sockaddr_dl));
if(dladdr.sdl_alen<6)
continue;
memcpy(&pdladdr,dladdr.sdl_data+dladdr.sdl_nlen,
dladdr.sdl_alen);
printf("%s:\t",curifa->ifa_name);
for(i=0;i<dladdr.sdl_alen-1;i++)
printf("%x:",pdladdr[i]);
printf("%x\n",pdladdr[i]);
}
}
freeifaddrs(ifa);
return 0;
}

[关闭][返回]