【发布时间】:2017-09-07 10:15:44
【问题描述】:
最近我对如何使用低级方法在 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;
}
}
为了更好地理解我的代码,“interfaces”变量是一个字符**,当我初始化一个新接口时,我在其中存储接口的名称,并且在将名称存储在该变量中之后的那个函数中,我返回一个 int作为处理程序。
在更改mac地址之前,我从代码中将接口放下。
现在,当我调用 ioctl 来更改 MAC 地址时,SIOCSIFHWADDR ioctl 返回 -1。
谁能帮帮我?对不起英语
【问题讨论】:
-
更改 MAC 地址?那不是硬件的只读标识符吗?
-
检查
errno以获取有关实际错误的详细信息。这可能会帮助你 -
strerror (errno) 总是返回“-1”
-
您是否有权执行此操作?做的时候界面是不是掉线了?并非所有网络适配器或内核驱动程序都支持更改 MAC 地址,但有些确实支持
-
是的,因为我使用 sudo 执行它。在调用 change_mac 之前谈论接口的状态我调用 if_down 这是我自己的实现,因为我在调用它 ifconfig 之后使用它来测试它
标签: c linux network-programming ioctl