socket套接字选项

时间:2023-02-08 18:54:31

本文写作背景基于对多网卡的配置,要求实现多个网卡同时上网,并且能指定
仅针对linux下的socket选项进行整理分析。

SOL_SOCKET  1

SO_DEBUG:启用套接字调试,只允许具备CAP_NET_ADMIN权限或有效进程ID为0的进程使用
SO_REUSEADDR:
<1>允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。
<2>允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。
<3>允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。
<4>允许完全重复的捆绑,一般来说,这个特性仅支持多播的系统,而且只对UDP套接口。
SO_TYPE:获取套接字类型(诸如SOCK_STREAM)
SO_ERROR:获取并清除未决的套接字错误。只读选项,返回一个整数值。
SO_DONTROUTE:不通过网关转发,直接发送给直接连接的主机。
SO_BROADCAST 6

SO_SNDBUF 7
SO_RCVBUF 8
SO_SNDBUFFORCE 32
SO_RCVBUFFORCE 33
设置接收和发送区缓存大小,文件位于/proc/sys/net/core/目录下的wmem_default,wmem_max,rmem_default,rmem_max。*FORCE的区别在于可以修改最大值的限制。

SO_KEEPALIVE:在面向连接的套接字上启用keep-alive消息发送
SO_OOBINLINE:如果启用此选项,带外数据直接放置在数据流中;否则,带外数据只能以MSG_OOB调用recv传递
SO_NO_CHECK 11
SO_PRIORITY 12
SO_LINGER:如果启用,close或shutdown调用将阻塞直到所有排队的消息被成功发送或者超时。
SO_BSDCOMPAT 14
SO_REUSEPORT 15

SO_PASSCRED 16
SO_PEERCRED 17

SO_RCVLOWAT
SO_SNDLOWAT
指定套接层传递数据到协议(SO_SNDLOWAT)或用户接收(SO_RCVLOWAT)时,缓冲区至少应该有多少字节数。两个值都初始化为1。SO_SNDLOWAT在Linux下是不可修改的。SO_RCVLOWAT从Linux 2.4开始可以修改。现行的select和poll系统调用并不理会Linux上的SO_RCVLOWAT设置,哪怕只有1字节可用也会标记套接字可读,接着的读取会被阻塞,直到SO_RCVLOWAT字节数可用。

SO_RCVTIMEO
SO_SNDTIMEO
指定接收或发送报告错误之前的超时值。参数是一个timeval结构。如果一个输入或输出函数在这段时间内阻塞,数据也已经被发送或接收,则其返回值将是传输的数据量;如果没有传输任何数据而超时,则其返回-1并设置EAGAIN或EWOULDBLOCK,就好像套接字是非阻塞的一样。如果超时值设置为0,则操作将一直阻塞。超时只是针对执行套接字I/O的系统调用如read,recvmsg,send,sendmsg有效,对select,poll,epoll_wait等则无效。


SO_SECURITY_AUTHENTICATION 22
SO_SECURITY_ENCRYPTION_TRANSPORT 23
SO_SECURITY_ENCRYPTION_NETWORK 24

SO_BINDTODEVICE:
将套接字绑定到一个特定设备,通过接口名称诸如“eth0”指定。如果名称是一个空字符串或长度为0,则移除设备。传递的选项是一个可变长度的,空字符结尾的本地接口名称字符串,最大长度是IFNAMSIZ。如果一个套接字绑定到一个接口,则它只能处理特定接口上接收的包。注意,只能在几种套接字类型上工作,特定于AF_INET。


SO_ATTACH_FILTER 26
SO_DETACH_FILTER 27
SO_GET_FILTER SO_ATTACH_FILTER

SO_PEERNAME 28
SO_TIMESTAMP 29
SCM_TIMESTAMP SO_TIMESTAMP

SO_ACCEPTCONN:只能用于getsockopt。0代表套接字不是监听套接字,1则代表是。

SO_PEERSEC 31
SO_PASSSEC 34
SO_TIMESTAMPNS 35
SCM_TIMESTAMPNS SO_TIMESTAMPNS

SO_MARK 36

SO_TIMESTAMPING 37
SCM_TIMESTAMPING SO_TIMESTAMPING

SO_PROTOCOL 38
SO_DOMAIN 39

SO_RXQ_OVFL 40

SO_WIFI_STATUS 41
SCM_WIFI_STATUS SO_WIFI_STATUS
SO_PEEK_OFF 42


SO_NOFCS

SO_LOCK_FILTER

SO_SELECT_ERR_QUEUE

SO_BUSY_POLL

SO_MAX_PACING_RATE

SO_BPF_EXTENSIONS

SO_INCOMING_CPU
SO_ATTACH_BPF
SO_DETACH_BPF SO_DETACH_FILTER