Когда я изучал сетевое программирование, я заметил две функции, а именно 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, я обнаружил, что ее четвертый параметр принимает строку или строку байтов (эквивалент указателя).
@user2357112 user2357112 Я понимаю, значит, смысл указателей здесь заключается только в том, чтобы параметры принимали разные типы?
Дело не столько в указателе, сколько в типе указателя, который он принимает: const void *option_value
. Указатель void
съест все, что вы ему дадите. option_name
сообщает setsockopt
, как потреблять то, что было дано.
Это должен быть указатель на getsockopt()
, чтобы он мог возвращать вам значения.
@user207421 user207421, он может вернуть структуру, содержащую код ошибки и значение, но аргумент-указатель позволяет удобно разделить их.
@ikegami нет структуры по причине, которую вы упомянули в своем ответе. Структуре потребуется объединение
@Крэйг Эсти Серьезно??? В этом так много неправильного. Вы злоупотребляете моими словами против меня, как будто знаете, что я сказал, лучше, чем я сам? И вы говорите, что я неправ, когда доказываете мою правоту (причина использования указателей не в том, что указатели необходимы для возврата значений).
Необходимо обмениваться данными разных типов.
int
.SO_RCVTIMEO
и SO_SNDTIMEO
обменяйтесь struct timeval
.SO_LINGER
меняет struct linger
.Поэтому требуется тип, совместимый с каждым из них. Можно было бы использовать union
, но это не обеспечивает прямой совместимости. Это будет препятствовать добавлению новых опций. Оставшийся вариант — использовать void *
.
Насколько я понимаю, причина, по которой указатели char используются вместо void, заключается в том, что сокеты BSD появились до добавления void в язык C. В то время указатели типа char были единственным доступным гибким типом указателей.
@SoronelHaetir, мне было интересно, о чем вы говорите - const void *
и void *
используются в связанных документах, а не в указателях на символы - пока я не проверил связанные документы Windows.
Я тоже до этого недоумевал, почему функции Microsoft используют const char *
.
Какой тип без указателя вы бы предложили, чтобы он работал для предоставления структуры
int
, структурыtimeval
, структурыlinger
или чего-либо еще, что может быть допустимо для какого-либо параметра?