Linux系统在Linux系统中,可以通过系统调用函数ioctl轻松获取服务器的mac地址。#include#include#include#include#include#includeintmain(){intsock,if_count,i;结构ifconfifc;结构ifreqifr[10];无符号字符mac[6];memset(&ifc,0,sizeof(structifconf));sock=socket(AF_INET,SOCK_DGRAM,0);ifc.ifc_len=10*sizeof(structifreq);ifc.ifc_buf=(char*)ifr;//获取所有网卡信息ioctl(sock,SIOCGIFCONF,(char*)&ifc);if_count=ifc.ifc_len/(sizeof(structifreq));对于(i=0;imtu1500inet172.17.0.1网络掩码255.255.0.0广播172.17.255.255inet6fe80::42:1cff:fed3:f8e8prefixlen64scopeid0x20ether02:42:1c:d3:f8:e8t??xqueuelen0(以太网)RX数据包0字节0(0.0B)RX错误0丢弃0溢出0帧0TX数据包5字节446(446.0B)TX错误0丢弃0溢出0载波0冲突0em1:flags=4163mtu1500inet192.168.102.108网络掩码255.255.255.0广播192.168.102.255inet6fe80::9f88:a3a9:1748:56fcprefixlen64scopeid0x20etherbueb8:2a:70:d2quet1:42(以太网)RX数据包4420019字节547543658(522.1MiB)RX错误0丢弃52溢出0帧0TX数据包6526650字节6637157039(6.1GiB)TX错误0丢弃0溢出0载波0冲突0设备中断55lo:flags=73mtu65536inet127.0.0.1netmask255.0.0.0inet6::1prefixlen128scopeid0x10looptxqueuelen1000(本地环回)RX数据包140886字节12507428(11.9MiB)RX错误0丢弃0溢出0帧0TX数据包140886字节12507428(11.9MiB)TX错误0丢弃0溢出0载波0冲突0p5p2:flags=4163mtu1500inet192.168.101.108netmask255.255.255.0广播192.168.101.255inet6fe80::427c:e13c:50b6:d747prefixlen64scopeid0x20ether90:e2:ba:89:46:bdtxqueuelen1000(以太网)RX数据包57573979字节44149879(Gi)RXerrors0dropped41overruns0frame0TXpackets1111442bytes673920374(642.7MiB)TXerrors0dropped0overruns0carrier0collisions0可见,取出来的mac地址是正确的AIX系统AIX系统基于power架构,没有SIOCGIFHWADDR接口。因此,它无法像Linux那样获取mac地址。这里提供两种方法:第一种方法#include#include#include#include#include#include#include#include#include/*forifconf*/#include/*对于sockaddr_in*/#includestaticintaix_get_mac_addr(uint8_tmac[6]){structifconfifc;结构ifreq*ifr;字符buf[640]="";intsock=socket(AF_INET,SOCK_DGRAM,0);ifc.ifc_len=640;ifc.ifc_buf=buf;如果(袜子<0){免费(ifr);返回-1;}ioctl(sock,CSIOCGIFCONF,&ifc);ifr=(structifreq*)buf;structsockaddr_dl*sdl=(structsockaddr_dl*)&ifr->ifr_addr;memcpy(mac,((caddr_t)((sdl)->sdl_data+(sdl)->sdl_nlen)),6);关闭(袜子);免费(ifr);返回0;}voidprint_mac(uint8_tmac[6]){printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);}intmain(void){unsignedcharmac[6];如果(aix_get_mac_addr(mac)==-1){perror("aix_getmac");退出(2);}print_mac(mac);}该方法的核心逻辑是通过ioctl(sock,SIOCGIFCONF,&ifc)取出网卡信息,并强制其地址为structsockaddr_dl类型当前操作系统:-bash-4.3#uname-aAIXlocalhost1600C553DC4C00-bash-4.3#oslevel6.1.0.0以上代码在AIX系统下运行结果:-bash-4.3#./mac100:11:25:c5:97:cc查看系统网卡:-bash-4.3#netstat-inNameMtuNetworkAddressIpktsIerrsOpktsOerrsCollen01500link#20.11.25.c5.97.cc1277055330112442430en01500192.1558.210192.1671.112442430lo016896link#117875140170978800lo016896127127.0.0.117875140170978800lo016896::1%117875140170978800,是正确的可见地址第二种方法#include#include#include#include#include#include#include#include#include/*对于ifconf*/#include/*对于sockaddr_in*/#include/*在AIX上获取以太网MAC地址*/staticintaix_get_mac_addr(uint8_tmac[6]){structifconfifc;结构ifreq*ifr;intsock=socket(AF_INET,SOCK_DGRAM,0);ifc.ifc_len=sizeof(structifreq);ifc.ifc_buf=(char*)ifr;如果(袜子<0){免费(ifr);返回-1;}ioctl(sock,SIOCGIFCONF,&ifc);size_tksize;结构kinfo_ndd*ndd;整数计数,我;ksize=getkerninfo(KINFO_NDD,0,0,0);如果(ksize==0){errno=ENOSYS;返回-1;}ndd=(structkinfo_ndd*)malloc(ksize);如果(ndd==NULL){errno=ENOMEM;返回-1;}if(getkerninfo(KINFO_NDD,ndd,&ksize,0)==-1){errno=ENOSYS;返回-1;}count=ksize/sizeof(structkinfo_ndd);for(i=0;iifr_name)==0||strcmp(ndd[i].ndd_name,ifr->ifr_name)==0)){memcpy(mac,ndd[i].ndd_addr,6);免费(ndd);返回0;}}免费(ndd);错误号=ENOENT;return-1;}voidprint_mac(uint8_tmac[6]){printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);}intmain(void){uint8_tmac[6];inti,ret;ret=aix_get_mac_addr(mac);if(ret==-1){perror("aix_getmac");exit(1);}print_mac(mac);}第二种方法是通过getkerninfo获取function相关硬件信息及其运行结果同第一种方法得到的:-bash-4.3#./mac200:11:25:c5:97:ccWindowssystem//TODO