《Linux高性能服务器编程》阅读笔记:
Linux系统中,有控制文件描述符属性的通用Posix系统调用fcntl(),还有两个专门用来读取和设置socket文件描述符属性的方法:
#include <sys/types.h>
#include <sys/socket.h>
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);
(1) sockfd参数指定被操作的目标socket
(2) level参数该描述符的使用的协议,如IPPROTO_IP(IPv4)、IPPROTO_IPV6(IPv6)、IPPROTO_TCP(TCP选项)
(3) option_name参数指定要设置的属性的名字,如用于修改描述符的接收缓冲区大小的SO_RCVBUF
(4) optval参数和optlen分别指定该属性要使用的值和值的属性,如修改缓冲区大小时optval为缓冲区的大小
具体如下表格:
level | option_name | optval | 说明 |
---|---|---|---|
SOL_SOCKET (通用socket协议,与具体协议无关) | SO_DEBUG | int | 打开调试信息 |
SO_REUSEADDR | int | 重用本地地址(TIME_WAIT状态的地址) | |
SO_TYPE | int | 获取socket类型 | |
SO_ERROR | int | 获取并清除socket错误状态 | |
SO_DONTROUTE | int | 不查看路由表,直接将数据发送给本地局域网的主机。含义和send()的flags参数设置为MSG_DONTROUTE标志类似 | |