例子:
// socket created above this
int iSocketOption = 1;
setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&iSocketOption, sizeof(iSocketOption));
我知道当您将通配符指针传递给 option_value arg(第 4 个 arg)设置为 1 的 int 地址时,您是在说,是的,使用 SO_REUSEADDR 选项。
但是最后一个参数 option_len 是怎么回事?这个想法似乎是回收之前用于 arg 的 int,使其成为一个缓冲区,用于报告不相关值的大小。那个不相关的值是什么?我应该用它做点什么吗?
这是 BSD 系统调用手册中让我感到困惑的摘录:
For getsockopt(), option_len is a value-result parameter, initially containing the size of the buffer pointed to by option_value, and modified on return to indicate the actual size of the value returned.
使用通过 setsockopt 的倒数第二个参数传入的缓冲区返回的大小是多少?
(当然,摘录是关于 getsockopt,而不是 setsockopt,但对最后一个参数没有其他解释。)
我为什么问这个问题:
Apress 的 More iPhone 3 Development 给出了这个套接字设置示例,在一个返回 BOOL 的方法中:
- (BOOL) methodInvolvingSocket {
// socket creation
int ret = 1;
setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&ret,
sizeof(ret));
//...socket address set up, but no further use of “ret.”
return ret;
}
在这个方法的最后,返回是使用“ret”——这是可行的,因为 ret 是 1,相当于 YES,但这是一件很奇怪的事情,除非有人期望“ret”可能会改变。
最佳答案
你从其他答案的评论中猜测是正确的。
setsockopt
用于设置许多不同类型的值。虽然许多(甚至可能是大多数)是 int
类型,但其他是不同大小的 struct
。由于 setsockopt
得到的唯一东西是一个指针,它无法知道 struct
有多大,这就是您需要告诉它的原因。
有关其他类型值的一些示例,请参阅位于 http://www.delorie.com/gnu/docs/glibc/libc_352.html 的 GNU C 文档
getsockopt也是一样,只是反过来而已。它假定您不知道该类型有多大,因此它将大小放入您为其提供的 int 中。您需要将其值设置为缓冲区的大小,以防止在获取该值时发生缓冲区溢出。
关于c - setsockopt option_len arg 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706576/