首先介绍两个专门用来读取和设置socket文件描述符属性的系统调用
getsockopt() && setsockopt()
函数原形:
//读取socket文件描述符的属性
int getsockopt(int sockfd , int level , int option_name , void* option_value , socklen_t* restrict option_len);
//设置socket文件描述符的属性
int setsockopt(int sockfd , int level , int option_name , const void* option_value , socklen_t option_len)
参数:
①、sockfd:
指定被操作的目标socket
②、level:
指定要操作哪个协议的选项,比如IPV4,IPV6、TCP等。
③、option_name:
指定选项的名字
④、option_value:
对于getsockopt()来说,指向返回选项值的缓冲。
对于setsockopt(),指向包含新选项值的缓冲。
④、option_len:
对于getsockopt()来说,作为入口参数时,选项值的最大长度。作为出口参数时,选值的实际长度。
对于setsockopt(),现选项的长度。
返回值
成功时返回0,失败时返回-1,并设置errno。
socket选项表
注意
对于服务器而言,部分socket选项只能在调用listen之前针对监听socket设置才有效。这是因为连接socket只能由accept调用返回,而accept从listen监听队列中获取的连接是已经完成三次握手的,这说明服务器已经想被接受的链接上发送出了TCP同步报文段。但有的socket选项却应该在TCP同步报文段中设置(比如:TCP的最大报文段)。
对于这种情况,应该对监听socket设置这些选项,那么accept返回的连接socket将自动继承这些选项。这些选项包括:SO_DEBUG , SO_DONTROUTE , SO_KEEPA