getsockopt api 设计问题
getsockopt api design questions
我们可以看到api定义为blow
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
问题 1:
假设给定一个级别和optname,那么我们知道optlen,为什么还需要用户提供optlen参数呢?
即使用户提供了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 手册页?
optlen
参数是in-out参数。在输入时,它指定在 optval
space 中有多少 space 可用,在输出时,它报告在 optval
中写入了多少 space到.
是的,实现改变了*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
。
我们可以看到api定义为blow
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
问题 1:
假设给定一个级别和optname,那么我们知道optlen,为什么还需要用户提供optlen参数呢?
即使用户提供了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 手册页?
optlen
参数是in-out参数。在输入时,它指定在optval
space 中有多少 space 可用,在输出时,它报告在optval
中写入了多少 space到.是的,实现改变了
*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
。