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

标签 c sockets core-foundation

例子:

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

相关文章:

macos - C 数据结构还是核心基础?

python - 在 OS X 中运行进程,查找启动进程

c++ - 在 C++ 中使用 Cgi 向浏览器发送数据而不使用 cout

c - 是什么导致字符串连接中的段错误?

c - 如何使用 libcurl 函数 "curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP4, char *address);"

java - 如何检查套接字的输出流是否关闭?

php - 如何将用户名从 php session 存储到 nodejs 中的 socket.io 库,并且套接字连接在页面刷新时断开连接。为什么?

java - Android 应用程序和 Web 浏览器之间的套接字通信

c - 未对齐的内存访问

ios - NSMutableSet 与自定义 isEqual : and hash callbacks