Почему четвертый параметр функций Setsockopt и Getsockopt должен быть указателем?

Когда я изучал сетевое программирование, я заметил две функции, а именно setsockopt() и getsockopt(). Среди них четвертый параметр — указатель. Однако на практике я чувствую, что четвертый параметр почти всегда передает числа или логические значения. Так в чем же смысл использования четвертого параметра в качестве указателя?

// Platform used for demonstration: Windows 10

// exmple 1
BOOL enable = TRUE;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&enable, sizeof(enable));

// or

// exmple 2
DWORD size = 2048;
setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&size, sizeof(size));

И я проверил соответствующие документы, в которых не упоминается использование этого параметра в качестве буфера для строк или чего-то подобного, поэтому я озадачен, почему этот параметр должен быть указателем.

Даже просматривая документацию Python по функции Setsockopt, я обнаружил, что ее четвертый параметр принимает строку или строку байтов (эквивалент указателя).

Какой тип без указателя вы бы предложили, чтобы он работал для предоставления структуры int, структуры timeval, структуры linger или чего-либо еще, что может быть допустимо для какого-либо параметра?

user2357112 14.06.2024 22:37

@user2357112 user2357112 Я понимаю, значит, смысл указателей здесь заключается только в том, чтобы параметры принимали разные типы?

S-N 14.06.2024 22:45

Дело не столько в указателе, сколько в типе указателя, который он принимает: const void *option_value. Указатель voidсъест все, что вы ему дадите. option_name сообщает setsockopt, как потреблять то, что было дано.

user4581301 14.06.2024 22:47

Это должен быть указатель на getsockopt(), чтобы он мог возвращать вам значения.

user207421 14.06.2024 22:49

@user207421 user207421, он может вернуть структуру, содержащую код ошибки и значение, но аргумент-указатель позволяет удобно разделить их.

ikegami 15.06.2024 01:04

@ikegami нет структуры по причине, которую вы упомянули в своем ответе. Структуре потребуется объединение

Craig Estey 15.06.2024 01:21

@Крэйг Эсти Серьезно??? В этом так много неправильного. Вы злоупотребляете моими словами против меня, как будто знаете, что я сказал, лучше, чем я сам? И вы говорите, что я неправ, когда доказываете мою правоту (причина использования указателей не в том, что указатели необходимы для возврата значений).

ikegami 15.06.2024 04:41
Стоит ли изучать 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
7
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Необходимо обмениваться данными разных типов.

  • Большое количество вариантов обмена на int.
  • SO_RCVTIMEO и SO_SNDTIMEO обменяйтесь struct timeval.
  • SO_LINGER меняет struct linger.

Поэтому требуется тип, совместимый с каждым из них. Можно было бы использовать union, но это не обеспечивает прямой совместимости. Это будет препятствовать добавлению новых опций. Оставшийся вариант — использовать void *.

Насколько я понимаю, причина, по которой указатели char используются вместо void, заключается в том, что сокеты BSD появились до добавления void в язык C. В то время указатели типа char были единственным доступным гибким типом указателей.

SoronelHaetir 15.06.2024 01:08

@SoronelHaetir, мне было интересно, о чем вы говорите - const void * и void * используются в связанных документах, а не в указателях на символы - пока я не проверил связанные документы Windows.

ikegami 15.06.2024 04:31

Я тоже до этого недоумевал, почему функции Microsoft используют const char *.

S-N 16.06.2024 01:03

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