获取和设置套接字选项
程序员文章站
2024-02-01 09:38:40
...
下面几种方法可用来获取和设置影响套接字的选项:
(1)getsockopt 和 setsockopt 函数;
(2)fcntl 函数;
(3)ioctl 函数。
本文将介绍 getsockopt 和 setsockopt 函数,对 fcntl 的介绍见fcntl 函数介绍,而对 ioctl 的介绍则留到后面。
其中参数 sockfd 指向一个打开的套接字描述符,level 指定系统中解释选项的代码或为通用套接字代码,或为某个特定于协议的代码(如 IPv4、IPv6、TCP 或 SCTP)。optval 是一个指向某个变量的指针,setsockopt 从 *optval 处取得选项 optname 待设置的新值,getsockopt 则把已获取的选项 optname 的当前值存放到 *optval 中。*optval 的大小由 optlen 参数指定。
套接字选项粗分为两大基本类型:一是启用或禁止某个特性的二元选项(称为标志选项),二是取得并返回可以设置或检查的特定值的选项(称为值选项)。下面的两张表汇总了可由 getsockopt 和 setsockopt 获取和设置的选项。其中的“数据类型”列给出了指针 optval 必须指向的每个选项的数据类型(这一列中后跟一对花括号的记法表示一个结构,如 linger{} 就表示 struct linger),标有“标志”的列指出一个选项是否为标志选项,当 *optval 的值是 0 时表示选项被禁止,反之则表示开启。如果“标志”列不含有“·”,那么相应选项用于在用户进程与系统之间传递所指定数据类型的值。
其中的这几个套接字选项是由 TCP 已连接套接字从监听套接字继承的:SO_DEBUG、SO_DONTROUTE、SO_KEEPALIVE、SO_LINGER、SO_OOBINLINE、SO_RCVBUF、SO_RCVLOWAT、SO_SNDBUF、SO_SNDLOWAT、TCP_MAXSEG 和 TCP_NODELAY。这对 TCP 是很重要的,因为 accept 一直要到 TCP 层完成三路握手后才会给服务器返回已连接套接字。如果想在三路握手完成时确保这些套接字选项中的某一个是给已连接套接字设置的,那么必须先给监听套接字设置该选项。
(1)getsockopt 和 setsockopt 函数;
(2)fcntl 函数;
(3)ioctl 函数。
本文将介绍 getsockopt 和 setsockopt 函数,对 fcntl 的介绍见fcntl 函数介绍,而对 ioctl 的介绍则留到后面。
#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); /* 两个函数的返回值:若成功,返回 0;否则,返回 -1 */
其中参数 sockfd 指向一个打开的套接字描述符,level 指定系统中解释选项的代码或为通用套接字代码,或为某个特定于协议的代码(如 IPv4、IPv6、TCP 或 SCTP)。optval 是一个指向某个变量的指针,setsockopt 从 *optval 处取得选项 optname 待设置的新值,getsockopt 则把已获取的选项 optname 的当前值存放到 *optval 中。*optval 的大小由 optlen 参数指定。
套接字选项粗分为两大基本类型:一是启用或禁止某个特性的二元选项(称为标志选项),二是取得并返回可以设置或检查的特定值的选项(称为值选项)。下面的两张表汇总了可由 getsockopt 和 setsockopt 获取和设置的选项。其中的“数据类型”列给出了指针 optval 必须指向的每个选项的数据类型(这一列中后跟一对花括号的记法表示一个结构,如 linger{} 就表示 struct linger),标有“标志”的列指出一个选项是否为标志选项,当 *optval 的值是 0 时表示选项被禁止,反之则表示开启。如果“标志”列不含有“·”,那么相应选项用于在用户进程与系统之间传递所指定数据类型的值。
其中的这几个套接字选项是由 TCP 已连接套接字从监听套接字继承的:SO_DEBUG、SO_DONTROUTE、SO_KEEPALIVE、SO_LINGER、SO_OOBINLINE、SO_RCVBUF、SO_RCVLOWAT、SO_SNDBUF、SO_SNDLOWAT、TCP_MAXSEG 和 TCP_NODELAY。这对 TCP 是很重要的,因为 accept 一直要到 TCP 层完成三路握手后才会给服务器返回已连接套接字。如果想在三路握手完成时确保这些套接字选项中的某一个是给已连接套接字设置的,那么必须先给监听套接字设置该选项。
上一篇: 为啥没找到id