SO_REUSEADDR
服务器程序设置SO_REUSEADDR选项,使得处于TIME_WAIT状态的socket也能被重新bind
SO_RCVBUF、SO_SNDBUF
- 分别表示TCP接收和发送缓冲区的大小
- 系统默认的最小值:接收缓冲区大小的最小值 = 256字节;发送缓冲区大小的最小值 = 2048字节
说明:可以修改内核参数/proc/sys/net/ipv4/tcp_rmem和/proc/sys/net/ipv4/tcp_wmen来强制TCP发送和接收缓冲区的大小没有最小值的限制 - 当使用setsockopt设置接收和发送缓冲区大小,如果设置的值小于系统默认的最小值,那么设置的大小被忽略;如果设置的值大于系统默认的最小值,那么缓冲区的大小 = 设置值 x 2
SO_REVLOWAT、SO_SNDLOWAT
- 低水位标记
- 它们一般被IO复用系统调用用来判断socket是否可读可写
- 当TCP接收缓冲区中可读数据的总数>低水位标记时,IO复用系统调用将通知应用程序对应的socket可读了
- 当TCP发送缓冲区中可写数据的空间>低水位标记时,IO复用系统调用将通知应用程序对应的socket可写了
SO_LINGER
介绍
- SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为。
- 默认情况下,当调用close关闭TCP连接时,close将立即返回,TCP发送缓冲区中残留的数据将发送给对方。
使用
设置SO_LINGER时,需要给setsockopt传递一个linger类型的结构体,其定义如下:
struct linger{
int l_onoff; //开启(非0)、关闭(0)
int l_linger; //滞留时间
};
- l_onoff = 0,此时l_linger选项不起作用,close用默认行为关闭socket。
- l_onoff != 0 && l_linger = 0,close立即返回,TCP发送缓冲区中残留的数据将被丢弃,同时向对方发送一个RST段(因此这种方式异常的终止了一个连接)
- l_onoff != 0 && l_linger > 0,此时close行为将取决于两个条件:发送缓冲区中是否有残留的数据、socket阻塞/非阻塞。
- if 阻塞的socket,close将等待一段长为l_linger的时间,直到所有的残留的数据得到对方的确认(如果在l_linger时间内,还有残留的数据没有得到对方的确认,那么close函数返回-1并设置errno=EWOULDBLOCK)
- if 非阻塞socket,close将立即返回,此时需要根据返回值和errno来判断残留的数据是否已经发送完毕
SO_RECVTIMEO、SO_SNDTIMEO
- SO_RECVTIMEO、SO_SNDTIMEO分别用来设置socket接收数据超时时间、发送数据超时时间
- 仅对与数据接收、数据发送相关的socket系统调用有效:send、sendmsg、recv、recvmsg、accept、connect
setsockopt实现超时连接函数