网络属性设置函数 setsockopt (设置绑定地址快速重用)

setsockopt 函数可以设置应用层、传输层、网络层的一些属性,比如

  • 应用层:绑定地址快速重用、允许广播、
  • 传输层:设置TCP最大数据段大小
  • 网络层:设置IP首部选项、服务类型、生存时间

         目录

1、setsockopt 参数和返回值解析

2、使用setsockopt 函数设置网络属性

(1) 绑定地址快速重用

(2) 允许广播

(3) 设置接收超时时间


1、setsockopt 参数和返回值解析

setsockopt函数设置网络属性,是针对套接字的,因为服务端和客户端的TCP数据段大小、接收缓冲区大小是可以不一样的。

第一个参数 sockfd你要设置哪个套接字的网络属性

第二个参数 level:你要设置哪一层的网络属性。上面提到,你可以设置应用层、传输层、网络层等三层的网络属性。这三层对应的可选值如下:

可选值含义
SOL_SOCKET应用层
IPPRO_TCP传输层
IPPROTO_IP网络层

第三个参数 optname:在选好第二个参数的基础上,要设置该层的哪个属性。

        如果第二个参数是 SOL_SOCKET, 可选值如下。因为第三个参数是void* 类型,所以填入的数据类型有多种,其中比较容易混淆的是 int 类型

  • 比如 SO_REUSERADDR,这里的int类型相当于一个bool类型,0代表false,1代表true
  • 比如 SO_RCVBUF,因为是要设置缓冲区大小,所以这里的int类型就代表要设置的字节数
可选值含义数据类型

SO_REUSEADDR

允许重用本地地址和端口int

SO_BROADCAST

允许发送广播数据int
SO_RCVTIMEO设置接收超时时间

struct timeval

(定义放在表格末尾)

SO_SNDTIMEO设置发送超时时间

struct timeval

(定义放在表格末尾)

SO_RCVBUF接收缓冲区大小int
SO_SNDBUF发送缓冲区大小int
SO_RCVLOWAT接收缓冲区下限int
SO_SNDLOWAT发送缓冲区下限int
SO_KEEPALIVE保持连接int
SO_DEBUG允许调试int
SO_DONTROUTE不查找路由int
SO_LINGER延迟关闭连接struct linger
SO_OOBINLINE带外数据放入正常数据流int
struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

        如果第二个参数是  IPPRO_TCP,可选值如下:

可选值含义数据类型
TCP_MAXSEGTCP最大数据段的大小 int
TCP_NODELAY不使用Nagle算法int

        如果第二个参数是 IPPROTO_IP,可选值如下:

可选值含义数据类型
IP_HDRINCL在数据包中包含IP首部int
IP_OPTIONS

IP首部选项

int
IP_TTL生存时间int

第四个参数 optlen:第三个参数对应的数据类型所占字节数。如果第三个参数填入的是int 类型,第四个参数就填 sizeof(int)

返回值:成功返回 0,失败返回 -1

2、使用setsockopt 函数设置网络属性

(1) 绑定地址快速重用

我们在运行服务端的时候,如果进程直接中断(比如收到了Ctrl+C发送了进程终止信号),此时没有正常完成四次挥手,服务端会进入close_wait状态,这个状态会持续两分钟左右。

这个时候如果我们重新运行服务端,bind函数会调用失败,因为上一次的服务端尽管处在close_wait状态,但依然在占用IP地址和端口号。为了不让服务端继续占用,我们可以将套接字的网络属性设为重用状态,表示上一个服务端就继续等吧,但是别占用资源。

int b_reuse = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(int));

(2) 允许广播

int b_br = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));

(3) 设置接收超时时间

struct timeval tout;
tout.tv_sec = 5;
tout.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tout, sizeof(struct timeval));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值