套接字机制提供了两个套接字选项接口来控制套接字的行为。一个接口用来设置选项,另外一个接口用来允许我们请求选项的状态。我们可以获得以及设置三种类型的选项。
1.通用选项,可以工作在所有的套接字类型。
2.在套接字层次上面进行管理的选项,但是依赖底部协议的支持。
3.和每个协议相关的协议选项。
Single UNIX Specification 只定义了套接字层的选项(上面所提到的前面两项)
我们可以通过setsockopt函数来设置套接字选项。
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);
返回:如果成功返回0,如果错误返回1。
参数level用来分辨option所应用的协议。如果option是通用套接字层次的选项,那么level设置成SOL_SOCKET。否则level设置成控制option的协议号。例如IPPROTO_TCP用于TCP选项,以及IPPROTO_IP用于IP选项。下面的表中就列出了Single UNIX Specification定义的通用的套接字层次的选项。
套接字选项
+-------------------------------------------------------------------------------------------------------------+
| Option | Type of val argument | Description |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_ACCEPTCONN | int | 返回套接字是否激活用于侦听(只用于getsockopt)。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_BROADCAST | int | 如果*val非0那么广播数据报。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_DEBUG | int | 如果*val非0那么激活网络驱动的调试。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_DONTROUTE | int | 如果*val非0,那么忽略通常的路由。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_ERROR | int | 返回并且清除提交的套接字错误(只用于getsockopt)。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_KEEPALIVE | int | 如果*val非0,那么激活定期活动的消息。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_LINGER | struct linger | 如果有未发送的消息存在以及套接字关闭,那么做延迟。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_OOBINLINE | int | 如果*val非0,那么将带外数据嵌入到正常数据中。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_RCVBUF | int | 接收缓存的字节大小。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_RCVLOWAT | int | receive调用返回的最小数据字节。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_RCVTIMEO | struct timeval | 套接字receive调用的超时值。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_REUSEADDR | int | 如果*val非0,那么重复使用bind的地址。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_SNDBUF | int | send缓存中的字节大小。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_SNDLOWAT | int | 一次send调用传输的最小数据字节量。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_SNDTIMEO | struct timeval | 一个套接字send调用的超时值。 |
|---------------+----------------------+----------------------------------------------------------------------|
| SO_TYPE | int | 辨别套接字类型(只在getsockopt中)。 |
+-------------------------------------------------------------------------------------------------------------+