TCP关闭的两种方法概述

一个TCP需要经过四次挥手才可以关闭连接,能够开启四次挥手的函数有两个:

int close(int sockfd)
int shutdown(int sockfd,int howto)

接下来就分别讲解一下这两个函数。

close()函数

函数原型

c 复制代码
#include<unistd.h>
int close(int sockfd)

这个函数主要是对套接字进行关闭,要是成功会返回0,要是出错则会返回-1,实际上,它会对套接字引用计数减一,当套接字引用计数为0时,它会彻底释放套接字。

关闭细节

在输入方向,系统内核会将该套接字设置为不可读,任何读操作都会返回异常。

在输出方向,系统内核尝试将发送缓冲区的数据发送给对端,并最后向对端发送一个 FIN 报文,接下来如果再对该套接字进行写操作会返回异常。

如果对端没有检测到套接字已关闭,还继续发送报文,就会收到一个 RST 报文,告诉对端:"Hi, 我已经关闭了,别再给我发数据了。"

shutdown()函数

函数原型

c 复制代码
#include<sys/socket.h>
int shutdown(int sockfd,int howto)

对已连接的套接字执行 shutdown 操作,若成功则为 0,若出错则为 -1。

第二个参数howto的选项

可能值 解释
SHUT_RD(0) 关闭输入流
SHUT_WR(1) 关闭输出流
SHUT_RDWR(2) 关闭输入流和输出流,相当于 SHUT_RD 和 SHUT_WR 操作各一次

close()函数和shutdown()函数同时关闭输出输入流的差异

顺序 close shutdown
第一点 关闭连接,并释放所有连接对应的资源 不会释放掉套接字和所有的资源
第二点 存在引用计数的概念,并不一定导致该套接字不可用 直接使得该套接字不可用
第三点 引用计数导致不一定会发出 FIN 结束报文 总是会发出 FIN 结束报文

此文章为11月Day 8学习笔记,内容来源于极客时间《网络编程实战》

相关推荐
终端鹿2 小时前
深度解析 WebSocket DevTools 插件
网络·websocket·网络协议
Anesthesia丶3 小时前
Windows WSL子系统设置独立IP访问
windows·网络协议·tcp/ip
小挪号底迪滴3 小时前
WebSocket实战:构建实时消息推送系统
网络·websocket·网络协议
゛anqiaoyun5 小时前
WebSocket告警无声音
网络·websocket·网络协议
Ka1Yan5 小时前
RPC核心原理:组件与调用流程
网络·网络协议·rpc
万象.5 小时前
Linux套接字socket编程(含TCP,UDP)
linux·tcp/ip·udp
历程里程碑5 小时前
39. 从零实现UDP服务器实战(带源码) V1版本 - Echo server
服务器·开发语言·网络·c++·网络协议·udp·php
好多渔鱼好多6 小时前
【网络协议】P2P技术
网络·网络协议·p2p
北京耐用通信7 小时前
耐达讯自动化实现CC-Link IE转EtherNet/IP网关跨协议协同技术方案
人工智能·科技·物联网·网络协议·自动化·信息与通信
Predestination王瀞潞7 小时前
CentOS7虚拟机安装过程中没有打开网卡,ip addr无法查看es33这个情况下的解决方法
服务器·网络·tcp/ip