getsockopt api 设计问题

getsockopt api design questions

我们可以看到api定义为blow

   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 的值?

谢谢

很容易understand.Because api面临很多选择,需要为以后的选择做准备。

示例:

假设 "optname=1" ,它将 return 64 字节的字符串。这时候你需要:

char optval[64]; socklen_toptlen=64;

您是否看过 getsockopt(2) or the POSIX specification of getsockopt() 的 Linux 手册页?

  1. optlen参数是in-out参数。在输入时,它指定在 optval space 中有多少 space 可用,在输出时,它报告在 optval 中写入了多少 space到.

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

例如,POSIX表示:

If the size of the option value is greater than option_len, the value stored in the object pointed to by the option_value argument shall be silently truncated. Otherwise, the object pointed to by the option_len argument shall be modified to indicate the actual length of the value.

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