close 和 shutdown

本文详细对比了close和shutdown两个系统调用函数在关闭套接字时的不同行为。close会直接发送FIN包并拒绝接收所有报文,而shutdown根据参数不同,可能仅关闭读或写,甚至读写同时关闭,对端状态和后续交互也有所不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

close和shutdown都是关闭套接字的系统调用函数

区别如下:

 

先说包交互流程:

close会直接发送FIN包,并且(一般情况)不再接收对方发送的任何报文,如果有收到报文会回复RST。

shutdown有三类情况:

1,在参数是SHUT_RD,也就是只关闭了读的时候,是不会发送任何表明关闭了读的协议报文的。同时对端还可以发送报文,本端也会回复ack,但是本端在用系统调用recv是收不到报文的,确切的说是:先以SHUT_RD调用了shutdown,再后面recv的时候是直接返回ret=0的,不管是阻塞还是非阻塞。

2,在参数是SHUT_WR,也就是只关闭了写的时候,会发送FIN报文,通知对端(关闭了写,其实没有明确flag表明是写)。对端的协议栈也会直接回复对FIN的ACK的,同时对端的socket状态会在协议栈发送了ack后变成CLOSE_WAIT。但是对端可以继续发送报文,然后本端也可以继续接收报文。

3,在参数是SHUT_RDWR,也就是关闭了读写的时候,会发送FIN报文,通知对端(关闭了读写,没有明确flag表明是读写)。对端的协议栈也会直接回复对FIN的ACK的,同时对端的socket状态会在协议栈发送了ack后变成CLOSE_WAIT。但是如果对端继续发送报文,那么主动关闭的一方会直接回RST的。

 

作用方式(没有亲测,查阅得知):

close关闭其实是减少计数,假如有dup过,那么并不会完全关闭套接字。

shutdown会直接根据参数对socket执行操作,而不管是不是dup过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值