网络编程socket选项

说明

在进行网络编程的时候,我们需要经常去查看并且设置套接字的某些特性。例如我们想去设置地址复用,设置读写数据的超时时间,想对读写缓冲区的大小进行调整,其中获得套接字的选项就是getsckopt()函数,那么对应话设置套接字的选项就是setsockopt()函数。

选项可能存在于多层协议中,他们总会出现在最上面的套接字层。当对套接字选项进行操作的时候,我们必须给出选项所在的层次与名称,为了操作套接字层的选项,应该将层的值指定为SOL_SOCKET,为了控制其它层的选项,必须给出控制选项的协议类型号。

对于服务器而言,有部分socket选项只能在调用listen系统调用前针对监听socket设置才有效。这是因为连接socket只能由accept调用返回,而accept从listen监听队列接受的连接至少已经完成了TCP三次握手的前两个步骤(因为listen监听队列中的连接至少已进入SYN_RCVD状态),这说明服务器已经往被接收连接上发送出了TCP同步报文段。但有的socket选项却应该在TCP同步报文段中设置,比如TCP最大报文段选项。对这种情况,linux给开发人员提供的解决方案是:对监听socket设置这些socket选项,那么accept返回的连接socket将自动继承这些选项。这些选项包括:SO_DEBUG、SO_DONTROUTE、SO_KEEPALIVE、SO_LINGER、SO_OOBINLINE、SO_RCVBUF、SO_RCVLOWAT、SO_SNDBUF、SO_SNDLOWAT、TCP_MAXSEG和TCP_NODELAY。

对于客户端而言,这些socket选项则应该在调用connect函数之前设置,因为connect调用成功返回之后,TCP三次握手已完成。

函数原型

#include <sys/scoket.h>  
int getsockopt ( int sockfd, int level, int option_name, void* option_value, socklen_t* restrict option_len ); 
int setsockopt ( int sockfd, int level, int option_name, const void* option_value, socklen_t option_len);  

参数说明

sock:将要被设置或者获取选项的套接字。

level:选项所在的协议层。

optname:需要访问的选项名。

optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。

optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。

返回值

执行成功的时候返回值为0,函数执行失败时返回为-1。 errno被设为以下的某个值:

套接字选项

按照参数level值的不同,套接字选项可以分为三大类:

所有的套接字选项如下表:

套接字选项表