【发布时间】:2010-11-20 15:58:01
【问题描述】:
在套接字编程中特别使用了套接字选项,即 setsockopt() 和 getsockopt() ?
【问题讨论】:
-
用于设置记录的套接字选项。这个问题的答案应该在规范和手册中寻找,而不是在论坛中。
标签: c sockets networking network-programming
在套接字编程中特别使用了套接字选项,即 setsockopt() 和 getsockopt() ?
【问题讨论】:
标签: c sockets networking network-programming
例如你想设置或知道接收缓冲区大小
1)
int skt, int sndsize;
err = setsockopt(skt, SOL_SOCKET, SO_RCVBUF, (char *)&sndsize,
(int)sizeof(sndsize));
err = getsockopt(skt, SOL_SOCKET, SO_RCVBUF, (char *)&sockbufsize, &size);
2) 复用地址
int on = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
【讨论】:
对于many 不同的事情,包括更改发送和接收缓冲区的大小、超时长度、多播、保持连接活动、禁用 Nagel 算法等。
根据您要与之交互的网络层,有不同级别的选项:套接字本身、IP、TCP 等等。
【讨论】:
如前所述,它们用于设置/获取套接字的各种选项。
例如,如果您正在测试崩溃的服务器应用程序,您不会等待一定的分钟数,然后内核才会允许您重用端口,从而避免“地址已在使用”错误消息。如果您使用SO_REUSEADDR 选项,可以避免这种情况,让其他套接字绑定到同一个端口,除非已经绑定了一个活动的侦听器。
您还可以通过在 Linux 机器上使用 TCP_INFO 来检索有关套接字的数据,例如丢失数据包/重新传输的数量等。
基本上,您可以配置所有精细设置。
setsockopt(2) 和 getsockopt(2) 的选项。
【讨论】:
从表面上看,套接字看起来像一个双向管道,这很有用,因为标准系统调用,如write、read、close 可以像在普通管道甚至文件上一样在它们上使用。即使您添加特定于套接字的调用(listen、connect、bind、accept),也有一个有用的抽象级别隐藏了细节以支持流或数据报套接字的概念。
但是,一旦特定协议的细节开始发挥作用并且需要调整特定设置(例如发送/接收缓冲区、超时设置),就需要一个非常通用的接口来考虑不同的设置及其特定的数据格式. getsockopt、setsockopt 是这个通用接口的一部分。
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
使用level 和optname 选择特定于协议的选项,特定于协议的数据隐藏在缓冲区中,因此这两个系统调用不需要知道操作系统可能的每个协议的设置支持——如果你的应用程序和实际的协议实现知道这些细节就足够了。
【讨论】: