gpt4 book ai didi

c - setsockopt option_len arg 的目的是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 06:06:51 25 4
gpt4 key购买 nike

例子:

// 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com