C - Getsockopt API 设计问题



我们可以看到 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 的价值?

谢谢

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

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

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

例如,POSIX说:

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

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

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

例:

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

夏亚·奥特瓦尔[64]; socklen_t optlen=64;

相关内容

  • 没有找到相关文章

最新更新