0

我们可以看到 api 被定义为打击

   int getsockopt(int sockfd, int level, int optname,
                  void *optval, socklen_t *optlen);

问题一:

  1. 假设给定一个级别和optname,那么我们知道了optlen,为什么还需要用户提供optlen参数呢?

  2. 甚至用户提供了 optlen,为什么它是指向 socklen_t 而不是直接指向 socklen_t 的指针?实现会以某种方式改变 optlen 的值吗?

谢谢

4

2 回答 2

0

很容易理解。因为api面临很多选择,需要为以后的选择做准备。

例子:

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

字符 optval[64];socklen_t optlen=64;

于 2019-03-08T06:28:45.290 回答
0

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

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

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

例如,POSIX 说:

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

该规范使用option_len您使用的地方optlen,以及option_value您使用的地方optval

于 2019-03-08T07:46:32.143 回答