最近我对如何使用低级别aproach访问和设置linux中的网络接口感兴趣。所以我发现,在网上搜索ioctl回调,我学会了如何使用它。我开始写下一些东西,但今天我在更改界面的mac地址方面遇到了问题。
我使用的代码是:
int change_mac(int handler){
srand(times(NULL));
get_hwaddr(handler,&req);
for(int i=0;i<6;i++){
req.ifr_hwaddr.sa_data[i]=(char)rand();
}
char err=ioctl(sock,SIOCSIFHWADDR,&req);
if(err<0){
printf("Problem to change the mac address with a random one\n %i",err);
exit(0);
}
}
int get_hwaddr(int handler,struct ifreq* req_a){
if(handler>=current){
return -1;
}
strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]));
if(ioctl(sock,SIOCGIFHWADDR,req_a)<0){
return -2;
}
}
为了更好地理解我的代码&#34;接口&#34;变量是一个char **,其中我在初始化一个新接口时存储接口的名称,并且在该函数中将该名称存储在该变量中之后,我将一个int作为处理程序返回。
在更改mac地址之前,从代码中我将接口放下。
现在,当我调用ioctl来更改带有SIOCSIFHWADDR ioctl的mac地址时返回-1。
任何人都可以帮助我吗?对不起英文
答案 0 :(得分:0)
SIOCGIFHWADDR,SIOCSIFHWADDR
使用ifr_hwaddr获取或设置设备的硬件地址。 硬件地址在struct sockaddr中指定。 sa_family包含ARPHRD_ *设备类型,sa_data包含L2 硬件地址从字节0开始。设置硬件 地址是特权操作。
所以,你需要很少的东西来改变MAC:
由于您在评论中确认您在主机上使用sudo运行它,请确保您的接口名称正确且未终止,即更改行:
strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]));
到行:
strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]) + 1);
以下是更改MAC的代码示例: https://gist.github.com/mad4j/8864135