socket套接字选项详解:setsockopt/getsockopt

目录

    • SO_REUSEADDR
    • SO_RCVBUF、SO_SNDBUF
    • SO_REVLOWAT、SO_SNDLOWAT
    • SO_LINGER
    • SO_RECVTIMEO、SO_SNDTIMEO


socket套接字选项详解:setsockopt/getsockopt_第1张图片

SO_REUSEADDR

服务器程序设置SO_REUSEADDR选项,使得处于TIME_WAIT状态的socket也能被重新bind

SO_RCVBUF、SO_SNDBUF

  1. 分别表示TCP接收和发送缓冲区的大小
  2. 系统默认的最小值:接收缓冲区大小的最小值 = 256字节;发送缓冲区大小的最小值 = 2048字节
    说明:可以修改内核参数/proc/sys/net/ipv4/tcp_rmem和/proc/sys/net/ipv4/tcp_wmen来强制TCP发送和接收缓冲区的大小没有最小值的限制
  3. 当使用setsockopt设置接收和发送缓冲区大小,如果设置的值小于系统默认的最小值,那么设置的大小被忽略;如果设置的值大于系统默认的最小值,那么缓冲区的大小 = 设置值 x 2

SO_REVLOWAT、SO_SNDLOWAT

  1. 低水位标记
  2. 它们一般被IO复用系统调用用来判断socket是否可读可写
  3. 当TCP接收缓冲区中可读数据的总数>低水位标记时,IO复用系统调用将通知应用程序对应的socket可读了
  4. 当TCP发送缓冲区中可写数据的空间>低水位标记时,IO复用系统调用将通知应用程序对应的socket可写了

SO_LINGER

介绍

  1. SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为。
  2. 默认情况下,当调用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

  1. SO_RECVTIMEO、SO_SNDTIMEO分别用来设置socket接收数据超时时间、发送数据超时时间
  2. 仅对与数据接收、数据发送相关的socket系统调用有效:send、sendmsg、recv、recvmsg、accept、connect
    socket套接字选项详解:setsockopt/getsockopt_第2张图片
    setsockopt实现超时连接函数
    socket套接字选项详解:setsockopt/getsockopt_第3张图片

你可能感兴趣的:(Unix环境高级编程(第3版))