我们可以看到api被定义为打击
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
问题1:
假设给定一个级别和optname,那么我们知道optlen,为什么我们还需要用户提供optlen参数?
即使用户提供了optlen,为什么它还是指向socklen_t的指针而不是socklen_t的指针?实现会以某种方式更改optlen的值吗?
谢谢
答案 0 :(得分:0)
这很容易理解。因为api面临许多选择,因此需要为将来的选择做准备。
示例:
假设“ optname = 1”,它将返回64bytes的字符串。此时,您需要:
char optval [64]; socklen_t optlen = 64;
答案 1 :(得分:0)
您是否看过getsockopt(2)
的Linux手册页或getsockopt()
的POSIX规范?
optlen
参数是输入输出参数。在输入时,它指定optval
空间中有多少可用空间,在输出时,它报告optval
中有多少空间被写入。
是的,该实现更改了*optlen
的值。
例如,POSIX说:
如果选项值的大小大于 option_len ,则存储在 option_value 参数所指向的对象中的值将被静默截断。否则,必须修改 option_len 参数所指向的对象,以指示该值的实际长度。
该规范在使用option_len
的地方使用optlen
,在使用option_value
的地方使用optval
。