getsockopt API设计问题

时间:2019-03-08 02:11:36

标签: c linux getsockopt

我们可以看到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 :(得分:0)

这很容易理解。因为api面临许多选择,因此需要为将来的选择做准备。

示例:

假设“ optname = 1”,它将返回64bytes的字符串。此时,您需要:

char optval [64]; socklen_t optlen = 64;

答案 1 :(得分:0)

您是否看过getsockopt(2)的Linux手册页或getsockopt()的POSIX规范?

  1. optlen参数是输入输出参数。在输入时,它指定optval空间中有多少可用空间,在输出时,它报告optval中有多少空间被写入。

  2. 是的,该实现更改了*optlen的值。

例如,POSIX说:

  

如果选项值的大小大于 option_len ,则存储在 option_value 参数所指向的对象中的值将被静默截断。否则,必须修改 option_len 参数所指向的对象,以指示该值的实际长度。

该规范在使用option_len的地方使用optlen,在使用option_value的地方使用optval