我们可以看到 API 被定义为 blow
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)
或 POSIXgetsockopt()
规范?
-
optlen
参数是一个输入-输出参数。 在输入时,它指定optval
空间中有多少可用空间,在输出时,它报告写入了多少optval
空间。 -
是的,实现会更改
*optlen
的值。
例如,POSIX说:
如果选项值的大小大于option_len,则存储在option_value参数指向的对象中的值应以静默方式截断。否则,应修改option_len参数指向的对象,以指示值的实际长度。
该规范使用option_len
您使用optlen
的地方,以及使用optval
option_value
。
这很容易理解。因为 api 面临许多选择,需要为未来的选择做好准备。
例:
假设"optname=1",它将返回64字节的字符串。此时,您需要:
夏亚·奥特瓦尔[64]; socklen_t optlen=64;