мы можем видеть, что API определен как удар
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
Вопрос 1:
Предположим, что заданы уровень и optname, тогда мы знаем optlen, почемунужен ли пользователю параметр optlen?
даже если пользователь предоставляет параметр optlen, почему это указатель на socklen_t, а не на socklen_t напрямую?Реализация изменит значение optlen как-нибудь?
Спасибо
Вы смотрели справочную страницу Linux для getsockopt(2) или спецификацию POSIX getsockopt()?
getsockopt(2)
getsockopt()
Параметр optlen является параметром входа-выхода. При вводе он указывает, сколько места доступно в optval пространстве, а при выводе сообщает, сколько места в optval было записано.
optlen
optval
Да, реализация изменяет значение *optlen.
*optlen
Например, POSIX говорит:
Если размер значения параметра больше, чем option_len , значение, сохраненное в объекте, указанном аргументом option_value , должно быть молча усечено. В противном случае объект, на который указывает аргумент option_len , должен быть изменен для указания фактической длины значения.
В спецификации используются option_len, где вы использовали optlen, и option_value, где вы использовали optval.
option_len
option_value
Это легко понять. Поскольку api сталкивается со многими опциями и должен подготовиться к будущим вариантам.
Пример:
предположим, что "optname = 1", он вернет строки размером 64 байта.На этот раз вам нужно:
char optval [64];socklen_t optlen = 64;