getsockopt, setsockopt - 获取或设置socket套接字相关的选项
函数使用
函数原型:
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);
功能:
获取或设置文件描述符sockfd对应的套接字选项。选项可能存在于多个协议级别;它们总是存在于最高的套接字级别。在操作套接字选项时,必须指定该选项所在的级别和该选项的名称。要在套接字API级别操作选项,级别指定为SOL_SOCKET。要处理任何其他级别的选项,提供了控制该选项的适当协议的协议号。例如,为了指示一个选项是由TCP协议解释的,则应将级别设置为TCP的协议号(IPPROTO_TCP)。
头文件:
#include <sys/types.h>
#include <sys/socket.h>
参数:
- sockfd:将要被设置或者获取选项的套接字的文件描述符。
- level:选项所在的协议层。
- optname:需要访问的选项名。
- optval:对于getsockopt(),指向返回选项值的地址。对于setsockopt(),指向包含新选项值的地址。
- optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。
返回值:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值:
EBADF:sockfd不是有效的文件描述符
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sockfd描述的不是套接字文件描述符
socket选项
根据level(SOL_SOCKET、IPPROTO_IP、IPPROTO_TCP)的不同,有对应的socket选项
1、level为SOL_SOCKET
选项名称 | 说明 | 数据类型 |
---|---|---|
SO_BROADCAST | 允许发送广播数据 | int |
SO_BSDCOMPAT | 与BSD系统兼容 | int |
SO_DOMAIN | 获取套接字域,如AF_INET6(此选项只读) | int |
SO_DEBUG | 允许调试 | int |
SO_DONTROUTE | 不经过网关,只向直接相连的主机发送数据 | int |
SO_ERROR | 获得套接字错误(此选项只读) | int |
SO_KEEPALIVE | 使能发送keep_alive报文 | int |
SO_LINGER | 设置或获取SO_LINGER选项 | struct linger |
SO_OOBINLINE | 使能带外数据放入正常数据流 | int |
SO_PROTOCOL | 获取套接字协议,如IPPROTO_SCTP(此选项只读) | int |
SO_RCVBUF | 接收缓冲区大小 | int |
SO_SNDBUF | 发送缓冲区大小 | int |
SO_RCVLOWAT | 接收缓冲区下限 | int |
SO_SNDLOWAT | 发送缓冲区下限 | int |
SO_RCVTIMEO | 接收超时 | struct timeval |
SO_SNDTIMEO | 发送超时 | struct timeval |
SO_REUSERADDR | 允许重用本地地址和端口 | int |
SO_TYPE | 获得套接字类型(此选项只读) | int |
更多选项说明请见:https://linux.die.net/man/7/socket
2、level为IPPROTO_IP
选项名称 | 说明 | 数据类型 |
---|---|---|
IP_ADD_MEMBERSHIP | 加入一个多播组 | struct ip_mreqn |
IP_HDRINCL | 在数据包中包含IP首部 | int |
IP_MTU | 获取socket的当前路径MTU(此选项只读) | int |
IP_OPTINOS | IP首部选项 | int |
IP_TOS | 服务类型 | |
IP_TTL | 生存时间 | int |
更多选项说明请见:https://linux.die.net/man/7/ip
1、level为IPPROTO_TCP
选项名称 | 说明 | 数据类型 |
---|---|---|
TCP_INFO | 收集socket的信息 | struct tcp_info |
TCP_MAXSEG | TCP最大数据段的大小 | int |
TCP_NODELAY | 不使用Nagle算法 | int |
TCP_QUICKACK | 使能quickack模式 | int |
更多选项说明请见:https://linux.die.net/man/7/tcp