【问题标题】:getsockopt api design questionsgetsockopt api设计问题
【发布时间】:2019-07-30 01:06:24
【问题描述】:

我们可以看到api被定义为blow

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

问题一:

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

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

谢谢

【问题讨论】:

    标签: c linux getsockopt


    【解决方案1】:

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

    例子:

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

    char optval[64]; socklen_t optlen=64;

    【讨论】:

      【解决方案2】:

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

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

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

      例如,POSIX 说:

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

      规范使用option_len,你使用optlenoption_value,你使用optval

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多