例如,要将网络接口设置为混杂模式,可以使用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);
我知道这两种方式是完全等效的,但是有什么区别吗?否则,为什么有两种方法可以做同一件事?
答案 0 :(得分:1)
通过仔细阅读源代码可以看出,两者之间的差异很小。具体来说,考虑__dev_set_promiscuity
的呼叫者。
setsockopt
界面最终调用dev_set_promiscuity
。ioctl
接口最终调用dev_change_flags
。由于与设备的文件描述符接口,机制一直存在一些重复。例如send()
与write()
。老实说,我从没想过太多。我想象ioctl
接口是为通用设备添加的自然事物,setsockopt
接口是为套接字添加的自然事物,因此两者最终都存在。您可以将套接字视为网络设备上的更高级别的抽象,因此,用于修改选项的更高级别的接口不会是不合理的添加。