setsockopt的option_len arg的目的是什么?

时间:2012-01-02 23:59:47

标签: c sockets core-foundation

示例:

// 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“可能会改变。

2 个答案:

答案 0 :(得分:3)

对于setsockopt,最后一个参数只是告诉函数在此之前参数的内存指针有多长。

答案 1 :(得分:2)

您对其他答案的评论是正确的。

setsockopt适用于设置许多不同类型的值。虽然许多(可能甚至大多数)属于int类型,但其他类型struct的大小不同。由于setsockopt获得的唯一内容是指针,因此无法知道struct的大小,这就是您需要告诉它的原因。

有关其他类型值的一些示例,请参阅http://www.delorie.com/gnu/docs/glibc/libc_352.html

上的GNU C文档

对于getsockopt也是如此,只是相反。它假定您不知道类型有多大,因此它将大小放入您为其提供的int中。您需要将其值设置为缓冲区的大小,以便在获得值时防止缓冲区溢出。