使用SIOCSIFFLAGS的setsockopt和ioctl有什么区别?

时间:2019-05-28 15:21:12

标签: c linux sockets

例如,要将网络接口设置为混杂模式,可以使用setsockopt作为

struct packet_mreq opt;
opt.mr_ifindex = the_very_interface_index;
setsockopt(socket_fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, (void*)&opt, sizeof(opt));

另一方面,as packet(7) suggested也可以将ioctl与SIOCSIFFLAGS选项一起使用,例如

struct ifreq req;
strcpy(req.ifr_name, the_very_interface_name);
ioctl(socket_fd, SIOCGIFFLAGS, &req);
req.ifr_flags |= IFF_PROMISC;
ioctl(socket_fd, SIOCSIFFLAGS, &req);

我知道这两种方式是完全等效的,但是有什么区别吗?否则,为什么有两种方法可以做同一件事?

1 个答案:

答案 0 :(得分:1)

通过仔细阅读源代码可以看出,两者之间的差异很小。具体来说,考虑__dev_set_promiscuity的呼叫者。

由于与设备的文件描述符接口,机制一直存在一些重复。例如send()write()。老实说,我从没想过太多。我想象ioctl接口是为通用设备添加的自然事物,setsockopt接口是为套接字添加的自然事物,因此两者最终都存在。您可以将套接字视为网络设备上的更高级别的抽象,因此,用于修改选项的更高级别的接口不会是不合理的添加。