选项 可能存在于多层协议中,它们总会出现在最上面的
socket
层;当操作socket
选项时,选项位于的层和选项的名称必须给出。
选项相关函数
setsockopt
头文件:
#include<sys/socket.h>
功能: 设置与
socket
关联的选项。原型:
1
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
参数:
sock: 将要被设置选项的
socket
。level: 选项所在的协议层。
值 含义 SOL_SOCKET
通用 socket
选项IPPROTO_IP
IP
选项IPPROTO_TCP
TCP
选项optname: 需要设置的选项名。
optval: 指向包含新选项值的缓冲(根据选项名称的数据类型进行转换)。
optlen: 选项值的最大长度
返回值:
0: 成功。
-1: 失败,错误原因可以通过 error 获得
值 含义 EBADF
sock
不是有效的文件描述符EFAULT
optval
指向的内存并非有效的进程空间EINVAL
optlen
无效ENOPROTOOPT
指定的协议层不能识别选项 ENOTSOCK
sock
描述的不是 socket
getsockopt
头文件:
#include<sys/socket.h>
功能: 获取与
socket
关联的选项。原型:
1
int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
参数:
sock: 将要被获取选项的
socket
。level: 选项所在的协议层。
值 含义 SOL_SOCKET
通用 socket
选项IPPROTO_IP
IP
选项IPPROTO_TCP
TCP
选项optname: 需要获取的选项名。
optval: 指向返回选项值的缓冲(根据选项名称的数据类型进行转换)。
optlen: 选项值的实际长度。
返回值:
0: 成功。
-1: 失败,错误原因可以通过 error 获得
值 含义 EBADF
sock
不是有效的文件描述符EFAULT
optval
指向的内存并非有效的进程空间ENOPROTOOPT
指定的协议层不能识别选项 ENOTSOCK
sock
描述的不是 socket
选项
协议层 | 选项名 | 说明 | 数据类型 |
---|---|---|---|
SOL_SOCKET | SO_BROADCAST | 允许发送广播数据 | int |
SO_DEBUG | 允许调试 | int | |
SO_DONTROUTE | 不查找路由 | int | |
SO_ERROR | 获得套接字错误 | int | |
SO_KEEPALIVE | 保持连接 | int | |
SO_LINGER | 延迟关闭连接 | struct linger | |
SO_OOBINLINE | 带外数据放入正常数据流 | 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 | |
SO_BSDCOMPAT | 与BSD系统兼容 | int | |
IPPROTO_IP | IP_HDRINCL | 在数据包中包含IP首部 | int |
IP_OPTINOS | IP首部选项 | int | |
IP_TOS | 服务类型 | int | |
IP_TTL | 生存时间 | int | |
IPPRO_TCP | TCP_MAXSEG | TCP最大数据段的大小 | int |
TCP_NODELAY | 不使用Nagle算法 | int |