在linux中获取IP及MAC代码如下
int getIPMAC()
{int sock;
struct sockaddr_in sin;
unsigned char mac[6];
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{
perror("socket");
return -1;
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ETH_NAME, strlen(ETH_NAME));
if(ioctl(sock, SIOCGIFADDR, &ifr) == 0)
{
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
fprintf(stdout, "%s : %s\n", ETH_NAME, inet_ntoa(sin.sin_addr));
}
if(ioctl(sock, SIOCGIFHWADDR, &ifr) == 0)
{
memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
fprintf(stdout, "hard ware addr: %x:%x:%x:%x:%x:%x\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
return 0;
}
在linux中获取IP及MAC须用到ioctl函数及struct ifreq结构
首先,我们来看看ioctl函数
函数头文件: #include <sys/ioctl.h>
函数原型: int ioctrl(int fd, int request, .../*(void *agrv */)
返回值:正常返回0,错误返回-1
在这里简单说一下ioctl
ioctl的第三个参数总为一个指针,但其类型信赖于request的参数,在这里我只简单说一下第三个指针为struct ifreq类型时,第二个参数的可选内容
若对ioctl兴趣的可以去度娘找找其他的
我现在简单介绍下在第三个参数为struct ifreq类型时,request的取值意义:
Request
SIOCSIFADDR 设置接口地址
SIOCGIFADDR 获取接口地址
SIOCSIFFLAGS 设置接口标志
SIOCGIFFLAGS 获取接口标志
SIOCSIFDSTADDR 设置点到点的地址
SIOCGIFDSTADDR 获取点到点的地址
SIOCSIFBRDADDR 设置广播地址
SIOCGIFBRDADDR 获取广播地址
SIOCSIFNETMASK 设置子网掩码
SIOCGIFNETMASK 获取子网掩码
SIOCGIFMTU 获取MTU
SIOCxxx 其他的请参考系统实现
说完ioctl,现在来说说struct ifreq结构
struct ifreq{
char ifr_name[IFNAMESIZE};
union
{
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
}ifr_ifru;
};