В чем разница между setsockopt и ioctl с SIOCSIFFLAGS? - PullRequest
1 голос
/ 28 мая 2019

Например, чтобы установить сетевой интерфейс на случайный режим, можно использовать setsockopt в качестве

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

С другой стороны, в качестве предложенного пакета (7) , одинтакже можно использовать 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 Ответ

1 голос
/ 29 мая 2019

Существует очень мало различий между ними, что можно увидеть, просматривая источник. В частности, рассмотрим абонентов __dev_set_promiscuity.

Всегда существовало некоторое дублирование механизмов из-за интерфейса файлового дескриптора для устройств. Например send() против write(). Если честно, я никогда не задумывался об этом слишком глубоко. Я полагаю, что ioctl интерфейсы - это естественная вещь, которую нужно добавить для универсальных устройств, а setsockopt интерфейсы - естественная, которую можно добавить для сокетов, так что оба они в конечном итоге существуют. Вы можете думать о сокетах как об абстракции более высокого уровня по сравнению с сетевым устройством, поэтому интерфейс более высокого уровня для изменения параметров не будет неразумным дополнением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...