В чем разница между setsockopt и ioctl с SIOCSIFFLAGS?

Например, чтобы установить сетевой интерфейс в неразборчивый режим, можно использовать 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);

Я понимаю, что эти два способа полностью эквивалентны, но есть ли разница? В противном случае, почему есть два способа сделать одно и то же?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
464
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  • Интерфейс setsockopt в конечном итоге вызывает dev_set_promiscuity.
  • Интерфейс ioctl в конечном итоге вызывает dev_change_flags.

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

Другие вопросы по теме

Как размер аргумента области памяти в read() и write() влияет на производительность ввода-вывода?
Когда мне нужно использовать/иметь make-файл?
GIT не работает у замененного пользователя - /bin/git: /bin/git: невозможно выполнить двоичный файл
Есть ли способ включить tor в качестве настроек системного прокси через Python в Linux?
Сравнить два файла и сохранить вывод в файл, только если есть несоответствие
Выполните команду linux, чтобы скопировать файлы PDF из текстового файла в каталог
Libcouchbase не устанавливается на Red Hat Enterprise Linux Server версии 6.6
Как я могу опубликовать свое программное обеспечение в общедоступных репозиториях Linux, чтобы оно было доступно с «подходящими» установщиками и т. д
Поиск подкаталогов глубины 1, которые _не_ содержат файл
Kubectl apply -f k8s: не может распознать службу и развертывание и не имеет совпадений для вида «Сервис» в версии «v1»