【读书笔记】socket描述符选项[SOL_SOCKET]

简介:   #include     int setsockopt( int socket, int level, int option_name,                        const void *option_value, size_t option_len);     第一个参数socket是套接字描述符。

 

#include <sys/socket.h>
    int setsockopt( int socket, int level, int option_name,
                        const void *option_value, size_t option_len);


    第一个参数socket是套接字描述符。第二个参数level是被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为 SOL_SOCKET。option_name指定准备设置的选项,option_name可以有哪些取值,这取决于level,以linux 2.6内核为例(在不同的平台上,这种关系可能会有不同),在套接字级别上(SOL_SOCKET),option_name可以有以下取值:
    1.     SO_DEBUG,打开或关闭调试信息。
          当option_value不等于0时,打开调试信息,否则,关闭调试信息。它实际所做的工作是在sock->sk->sk_flag中置SOCK_DBG(第10)位,或清SOCK_DBG位。
    2.     SO_REUSEADDR,打开或关闭地址复用功能。
          当option_value不等于0时,打开,否则,关闭。它实际所做的工作是置sock->sk->sk_reuse为1或0。
    3.     SO_DONTROUTE,打开或关闭路由查找功能。
          当option_value不等于0时,打开,否则,关闭。它实际所做的工作是在sock->sk->sk_flag中置或清SOCK_LOCALROUTE位。
    4.     SO_BROADCAST,允许或禁止发送广播数据。
          当option_value不等于0时,允许,否则,禁止。它实际所做的工作是在sock->sk->sk_flag中置或清SOCK_BROADCAST位。
    5.     SO_SNDBUF,设置发送缓冲区的大小。
          发送缓冲区的大小是有上下限的,其上限为256 * (sizeof(struct sk_buff) + 256),下限为2048字节。该操作将sock->sk->sk_sndbuf设置为val * 2,之所以要乘以2,是防
      止大数据量的发送,突然导致缓冲区溢出。最后,该操作完成后,因为对发送缓冲的大小作了改变,要检查sleep队列,如果有进程正在等待写,将它们唤醒。
    6.     SO_RCVBUF,设置接收缓冲区的大小。
          接收缓冲区大小的上下限分别是:256 * (sizeof(struct sk_buff) + 256)和256字节。该操作将sock->sk->sk_rcvbuf设置为val * 2。
    7.     SO_KEEPALIVE,套接字保活。
          如果协议是TCP,并且当前的套接字状态不是侦听(listen)或关闭(close),那么,当option_value不是零时,启用TCP保活定时器,否则关闭保活定时器。对于所有协议,该操
      作都会根据option_value置或清sock->sk->sk_flag中的 SOCK_KEEPOPEN位。
    8.     SO_OOBINLINE,紧急数据放入普通数据流。
          该操作根据option_value的值置或清sock->sk->sk_flag中的SOCK_URGINLINE位。
    9.     SO_NO_CHECK,打开或关闭校验和。
          该操作根据option_value的值,设置sock->sk->sk_no_check。
    10.     SO_PRIORITY,设置在套接字发送的所有包的协议定义优先权。Linux通过这一值来排列网络队列。
          这个值在0到6之间(包括0和6),由option_value指定。赋给sock->sk->sk_priority。
    11.     SO_LINGER,如果选择此选项, close或 shutdown将等到所有套接字里排队的消息成功发送或到达延迟时间后>才会返回. 否则, 调用将立即返回。
          该选项的参数(option_value)是一个linger结构:
              struct linger {
                  int   l_onoff;    /* 延时状态(打开/关闭) */
                  int   l_linger;   /* 延时多长时间 */
              };
      如果linger.l_onoff值为0(关闭),则清sock->sk->sk_flag中的SOCK_LINGER位;否则,置该位,并赋sk->sk_lingertime值为linger.l_linger。
    12.     SO_PASSCRED,允许或禁止SCM_CREDENTIALS 控制消息的接收。
          该选项根据option_value的值,清或置sock->sk->sk_flag中的SOCK_PASSCRED位。
    13.     SO_TIMESTAMP,打开或关闭数据报中的时间戳接收。
          该选项根据option_value的值,清或置sock->sk->sk_flag中的SOCK_RCVTSTAMP位,如果打开,则还需设sock->sk->sk_flag中的SOCK_TIMESTAMP位,同时,将全局变量
      netstamp_needed加1。
    14.     SO_RCVLOWAT,设置接收数据前的缓冲区内的最小字节数。
          在Linux中,缓冲区内的最小字节数是固定的,为1。即将sock->sk->sk_rcvlowat固定赋值为1。
    15.     SO_RCVTIMEO,设置接收超时时间。
          该选项最终将接收超时时间赋给sock->sk->sk_rcvtimeo。
    16.     SO_SNDTIMEO,设置发送超时时间。
          该选项最终将发送超时时间赋给sock->sk->sk_sndtimeo。
    17.     SO_BINDTODEVICE,将套接字绑定到一个特定的设备上。
          该选项最终将设备赋给sock->sk->sk_bound_dev_if。
    18.     SO_ATTACH_FILTER和SO_DETACH_FILTER。
          关于数据包过滤,它们最终会影响sk->sk_filter。
          以上所介绍的都是在SOL_SOCKET层的一些套接字选项,如果超出这个范围,给出一些不在这一level的选项作为参数,最终会得到- ENOPROTOOPT的返回值。但以上的分析仅限
      于这些选项对sock-sk的值的影响,这些选项真正如何发挥作用,我们的探索道路将漫漫其修远。
相关文章
|
7月前
|
算法 Unix
socket套接字选项getsockopt&setsockopt
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项。getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
102 0
|
4月前
|
缓存 网络协议 算法
提高服务端性能的几个socket选项
提高服务端性能的几个socket选项
153 3
|
网络协议 API
SOCKET选项
在了解SOCKET选项之前请先了解TCP/IP协议的基本知识,如三次握手,四次挥手,11种状态之间是如何迁移,调用socket各个API会让TCP层进行什么操作等。API头文件: sys/socket.
4481 0
|
缓存 网络协议 Windows
Socket编程中的强制关闭与优雅关闭及相关socket选项
以下描述主要是针对windows平台下的TCP socket而言。 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包(FIN,RST等),具体的交换过程可以看TCP协议,这里不详细描述了。
1871 0
下一篇
DataWorks