示例:
// socket created above this
int iSocketOption = 1;
setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&iSocketOption, sizeof(iSocketOption));
据我所知,当你将一个通配符指针传递给一个int的地址为option_value arg(4th arg)时,你说是的,使用SO_REUSEADDR选项。
但是最后一个arg的option_len是怎么回事?这个想法似乎是在它之前回收用于arg的int,使其成为一个缓冲区,用于报告无关值的大小。什么是无关的价值?我应该用它做点什么吗?
以下是BSD系统调用手册的摘录,令我感到困惑:
对于getsockopt(),option_len是一个value-result参数,最初包含option_value指向的缓冲区的大小,并在返回时修改,以指示返回值的实际大小。
使用通过倒数第二个ark of setsockopt传入的缓冲区返回其大小的值是什么?
(当然,摘录是关于getsockopt,而不是setsockopt,但是对于最后一个arg没有其他解释。)
为什么我问这个问题:
Apress的更多iPhone 3开发提供了套接字设置示例,在返回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“可能会改变。
答案 0 :(得分:3)
对于setsockopt
,最后一个参数只是告诉函数在此之前参数的内存指针有多长。
答案 1 :(得分:2)
您对其他答案的评论是正确的。
setsockopt
适用于设置许多不同类型的值。虽然许多(可能甚至大多数)属于int
类型,但其他类型struct
的大小不同。由于setsockopt
获得的唯一内容是指针,因此无法知道struct
的大小,这就是您需要告诉它的原因。
有关其他类型值的一些示例,请参阅http://www.delorie.com/gnu/docs/glibc/libc_352.html
上的GNU C文档对于getsockopt也是如此,只是相反。它假定您不知道类型有多大,因此它将大小放入您为其提供的int中。您需要将其值设置为缓冲区的大小,以便在获得值时防止缓冲区溢出。