GesockOppt API вопросы дизайна - PullRequest
0 голосов
/ 08 марта 2019

мы можем видеть, что API определен как удар

   int getsockopt(int sockfd, int level, int optname,
                  void *optval, socklen_t *optlen);

Вопрос 1:

  1. Предположим, что заданы уровень и optname, тогда мы знаем optlen, почемунужен ли пользователю параметр optlen?

  2. даже если пользователь предоставляет параметр optlen, почему это указатель на socklen_t, а не на socklen_t напрямую?Реализация изменит значение optlen как-нибудь?

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Вы смотрели справочную страницу Linux для getsockopt(2) или спецификацию POSIX getsockopt()?

  1. Параметр optlen является параметром входа-выхода. При вводе он указывает, сколько места доступно в optval пространстве, а при выводе сообщает, сколько места в optval было записано.

  2. Да, реализация изменяет значение *optlen.

Например, POSIX говорит:

Если размер значения параметра больше, чем option_len , значение, сохраненное в объекте, указанном аргументом option_value , должно быть молча усечено. В противном случае объект, на который указывает аргумент option_len , должен быть изменен для указания фактической длины значения.

В спецификации используются option_len, где вы использовали optlen, и option_value, где вы использовали optval.

0 голосов
/ 08 марта 2019

Это легко понять. Поскольку api сталкивается со многими опциями и должен подготовиться к будущим вариантам.

Пример:

предположим, что "optname = 1", он вернет строки размером 64 байта.На этот раз вам нужно:

char optval [64];socklen_t optlen = 64;

...