一:linux下的网络设备
linux的网络设备信息都在/proc/net/dev,从这里我们可以得到所有网卡的名字,如eth0, eth1等等
root@dlrc-desktop:/home/dlrc/dlsp-ep9302/work/mystar-v0.4# cat /proc/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop lo: 472252 1696 0 0 0 0 0 0 472252 1696 0 0 0 0 0 0 eth1:20826443 20156 0 0 0 0 0 0 926357 14613 0 0 0 0 0 0
上面的lo和eth1便是我的网卡名字。ifconfig就是读取/proc/net/dev这个文件来取得设备名列表的。
二:读取网卡mac地址
可以通过ioctl(sock, SIOCGIFHWADDR, &ifr)读取mac地址,对任意类型的socket都适用,只需指定第三参数struct ifreq ifr的ifr.ifr_name, 这个ifr_name就是网络设备的名字,如eth0, eth1, lo等,在/proc/net/dev可找到。ioctl通过ifr_name获取设备信息。
struct ifreq ifr;
strncpy(ifr.ifr_name, name, 6);
if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
perror("get_hwaddr ioctl:");
close(sock);
return -1;
}
struct ifreq ifr;
strncpy(ifr.ifr_name, name, 6);
if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
perror("get_hwaddr ioctl:");
close(sock);
return -1;
}
以下是一个实现:
/**
* get_hwaddr - get netdevice mac addr
* @name: device name, e.g: eth0
* @hwaddr: where to save mac, 6 byte hwaddr[6]
* @return: 0 on success, -1 on failure
*/
int get_hwaddr(char *name, unsigned char *hwaddr)
{
struct ifreq ifr;
unsigned char memzero[6];
int sock;
if(name == NULL ||