socket选项
读取和设置socket文件描述的方法如下
1 |
|
sockfd
参数指定被操纵的目标socket,level
参数指定要操作的协议选项,optname
参数则指定选项的名字,optval
和optlen
参数分别是操作选项的值和长度。截图了一下书中的表格。
getsockopt
和setsockopt
这两个函数成功时返回0,失败时返回-1并设置errno
。
需要注意的是,在服务器端setsockopt
最好在listen
之前进行调用(因为连接socket只能由accept调用返回,而accept 从 listen 监听队列中接受的连接至少已经完成了TCP三次握手的前两个步骤)。同理,对客户端而言,这些socket选项则应该在调用connect 函数之前设置,因为connect调用成功返回之后,TC三次握手已完成。
SO_REUSEADDR
设置服务器可以立即重启,不需要等待TIME_WAIT
状态过去,可以使用SO_REUSEADDR
1 | int sock = socket( PF_INET, SOCK_STREAM, 0 ); |
经过setsockopt的设置之后,即使sock处于TIME_WAIT状态,与之绑定的socket地址也可以立即被重用。
SO_RCVBUF和SO_SNDBUF
SO_RCVBUF
和SO_SNDBUF
分别设置TCP接收缓冲区和发送缓冲区的大小。但是,当我们使用setsockopt
设置TCP缓冲区大小时,系统都会将其值进行加倍,并且不会小于某个值。TCP接收缓冲区最小值是256字节,发送缓冲区最小是2048字节。小值是2048字节(不过,不同的系统可能有不同的默认最小值)。系统这样做的目的,主要是确保一个TCP连接拥有足够的空闲缓冲区来处理拥塞(比如快速重传算法就期望TCP接收缓冲区能至少容纳4个大小为SMSS的TCP报文段)。
1 |
|
emmm不知道为啥大小是这样,后续再看看。