【问题标题】:What is the purpose of setsockopt's option_len arg?setsockopt option_len arg 的用途是什么?
【发布时间】:2012-02-01 03:45:45
【问题描述】:

例子:

// socket created above this
int iSocketOption = 1; 
setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&iSocketOption, sizeof(iSocketOption));

我了解,当您将通配符指针传递给 option_value arg(第 4 个参数)设置为 1 的 int 地址时,您的意思是,是的,使用 SO_REUSEADDR 选项。

但是最后一个参数 option_len 是怎么回事?这个想法似乎是回收它之前用于 arg 的 int,使其成为用于报告不相关值大小的缓冲区。那不相关的价值是什么?我应该用它做点什么吗?

这是 BSD 系统调用手册的摘录,让我感到困惑:

对于getsockopt(),option_len 是一个value-result 参数,最初包含option_value 指向的缓冲区的大小,并在返回时修改以指示返回值的实际大小。

使用通过 setsockopt 的倒数第二个参数传入的缓冲区返回其大小的值是多少?

(当然,摘录是关于getsockopt,而不是setsockopt,但对于最后一个参数没有其他解释。)


我为什么问这个问题:

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

【问题讨论】:

    标签: c sockets core-foundation


    【解决方案1】:

    您从另一个答案的 cmets 中猜对了。

    setsockopt 用于设置许多不同类型的值。虽然许多(甚至可能大多数)是 int 类型,但其他的则是大小不一的 structs。由于setsockopt 得到的唯一东西是一个指针,它无法知道struct 有多大,这就是为什么你需要告诉它。

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

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

    【讨论】:

    • 感谢 Moshe 的确认和详细说明。不过,我将对罗伯特的回答留下“正确”的检查,因为叙述是从那里自然发展的。
    【解决方案2】:

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

    【讨论】:

    • 它需要知道那个参数有多大,这样它才能提取包含的值(对于 SO_REUSEADDR 只是是/否)?它不会将该内存用于其他任何事情吗?它永远不会改变 iSocketOption 的值?
    • @Wienke:C 中的函数调用是按值传递的。 int 值被复制到最后一个参数中; setsockopt 可以随意更改自己的副本,但不能更改你的任何变量。
    • @Peter:最后一个参数中的值是第三个参数指向的内存大小,所以我假设该函数实际上可以改变那里的内容。
    • 好吧,这是我的猜测:虽然 SO_REUSEADDR 可以配置一个简单的 0/1 值,可以在单个 int 参数中发送,但一些 other 选择可能需要更复杂的配置,因此该函数的结构允许缓冲区及其大小。
    • 该函数无法更改驻留在那里的内容,因为setsockopt 的签名是:setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); 注意const 上的optval
    猜你喜欢
    • 2021-12-23
    • 2012-06-03
    • 1970-01-01
    • 2010-09-27
    • 2011-12-17
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多