网络-TCP关闭连接(close、shutdown)

在TCP协议中,关闭连接的过程可以通过shutdown函数和close函数来实现。

close

close函数用于关闭一个socket描述符。实际上是对socket的引用计数-1,当引用计数为0时,就会被关闭。且是关闭两个方向的数据流。如果是多个进程共享一个socket描述符(例如通过fork调用产生的子进程,那么socket的引用计数会+1),那么只有当所有引用socket的文件描述符都被关闭后,才会真正意义上的关闭连接并释放资源。

调用close函数将会完全关闭socket,不再允许任何读写操作。如果还有数据未发送给对方,系统会尝试在关闭前发送完这些数据(受TCP协议的控制)。在调用close之后,该socket描述符不再有效,不能再被用于读写操作。

系统内核会将socket设置为不可读,任何读操作都会返回异常;在数据发送方向,系统内核尝试将发送缓冲区的数据发送给对端,并最后向对端发送一个FIN报文,接下来如果再对socket进行写操作会返回异常。

shutdown

shutdown函数用于关闭一个socket的读写操作,或者两者都关闭。它允许更细粒度的控制,比如可以只关闭发送操作而保持接收操作开启(半关闭状态),这对于告知对端数据发送完毕而还能继续接收数据很有用。

shutdown的使用场景一般是当你想明确告诉对端所有的数据已经发送完毕,并且你想继续接收对端的数据直到对方完成发送。

shutdown函数允许指定关闭操作的类型:

SHUT_RD(0):关闭socket的接收操作。关闭连接的"读",对该socket进行读操作返回 EOF,并且套接字上接收缓冲区已有的数据将被丢弃,如果再有新的数据流到达,会确认收到数据,返回ACK,但是数据包会被丢弃。

SHUT_WR(1):关闭socket的发送操作。关闭连接的"写",在这种情况下,连接处于"半关闭"状态。套接字上发送缓冲区已有的数据将被立即发送出去,并发送一个 FIN 报文给对端。应用程序如果对该套接字进行写操作会报错。

SHUT_RDWR(2):同时关闭socket的接收和发送操作。

总结区别

shutdown提供了一种更为灵活的方式来关闭socket的一部分功能(接收、发送或两者都关闭),而close是彻底关闭socket并释放其资源。

使用shutdown可以实现所谓的"半关闭"状态,这在某些通信协议中非常有用,例如当一方完成数据发送后需要等待对方的响应。close则表示一个更终极的操作,用于结束socket的使用并释放相关资源。

相关推荐
CHENKONG_CK4 小时前
晨控CK-FR102ANS-EIP与基恩士KVX520系列PLC配置EtherNet/IP通讯连接手册
网络
草根站起来5 小时前
“双算法SSL证书”伪方案、国产SSL证书营销话术与等保绑定乱象批判
网络·网络协议·ssl
Bobolink_6 小时前
跨境业务网络环境评估,“干净、一致、独享”三个关键指标
开发语言·网络·php·跨境网络·网络环境
humors2216 小时前
【分享】火绒恶意网址自定义规则,根据互联网应急中心部分威胁预警恶意代码制作
网络·安全·规则·火绒安全·恶意网址·应急中心
技术民工之路7 小时前
Python Socket编程零基础实战教程(TCP/UDP通信完整版)
python·tcp/ip·udp
weixin_307779137 小时前
Linux下Nginx故障系统化检查Shell脚本
linux·运维·服务器·nginx·自动化
广州灵眸科技有限公司7 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
星恒讯工业路由器9 小时前
VLAN在工业网络中为何越来越重要
网络·信息与通信·vlan·交换机·工业网络·网络隔离
山峰哥9 小时前
数据库工程与索引策略实战指南‌
服务器·数据库·sql·oracle·深度优先
rcms152702692189 小时前
HITEK A1052100N-01 以太网端口模块
网络