关于setsockopt()和getsockopt()函数

时间:2010-11-20 15:58:02

标签: c sockets networking network-programming

是什么特别使用套接字选项,即套接字编程中的setsockopt()和getsockopt()?

4 个答案:

答案 0 :(得分:4)

例如,您想要设置或知道接收缓冲区大小

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)

答案 1 :(得分:2)

对于many不同的事情,包括更改发送和接收缓冲区的大小,超时的长度,多播,保持连接活动,禁用Nagel算法等。

有多种选择取决于您要与之交互的网络层:套接字本身,IP,TCP等。

答案 2 :(得分:2)

如前所述,它们用于设置/获取套接字的各种选项。

例如,如果您正在测试崩溃的服务器应用程序,那么在内核允许您重复使用该端口之前,您不必等待一定的分钟数,从而避免使用“已在使用的地址”错误消息。如果使用SO_REUSEADDR选项,允许其他套接字绑定到同一端口,除非已绑定了活动侦听器,否则可以避免这种情况。

您还可以使用Linux计算机上的TCP_INFO检索有关套接字的数据,例如丢失数据包/重新传输的数量等。

基本上,您可以配置所有精细设置。

setsockopt(2)getsockopt(2)的选项。

答案 3 :(得分:2)

从表面上看,套接字看起来像双向管道,因为标准系统调用(如writereadclose)可以在它们上使用,就像在普通管道甚至文件上一样。即使你添加特定于套接字的调用(listenconnectbindaccept),也有一个有用的抽象级别隐藏了有利于这个概念的细节流式传输或数据报套接字。

但是只要协议特定的细节发挥作用并且需要调整特定设置(例如发送/接收缓冲区,超时设置),就需要一个非常通用的接口来考虑不同的设置及其特定的数据格式。 getsockoptsetsockopt是此通用界面的一部分。

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);

使用leveloptname选择特定于协议的选项,并且特定于协议的数据隐藏在缓冲区中,因此两个系统调用不需要知道每个设置的任何内容操作系统可能支持的协议 - 如果您的应用程序和实际协议实现了解这些详细信息就足够了。