当前位置: 首页 > news >正文

TCP关闭的两种方法概述

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

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

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

close()函数

函数原型

#include<unistd.h>
int close(int sockfd)

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

关闭细节

在输入方向,系统内核会将该套接字设置为不可读,任何读操作都会返回异常。
在输出方向,系统内核尝试将发送缓冲区的数据发送给对端,并最后向对端发送一个 FIN 报文,接下来如果再对该套接字进行写操作会返回异常。
如果对端没有检测到套接字已关闭,还继续发送报文,就会收到一个 RST 报文,告诉对端:“Hi, 我已经关闭了,别再给我发数据了。”

shutdown()函数

函数原型

#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()函数同时关闭输出输入流的差异

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

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

http://www.lryc.cn/news/227415.html

相关文章:

  • Git的Hooks机制
  • 代码随想录算法训练营第四十九天|121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II
  • Rust教程6:并发编程和线程通信
  • JVM在线分析-监控工具(jps, jstat, jstatd)
  • Console LDAP 配置解密
  • node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)
  • 基础(二)
  • 思维模型 目标效应
  • 【从0到1设计一个网关】性能优化---Netty线程数配置与JVM参数配置
  • node插件MongoDB(五)—— 库mongoose 的模块化(五)
  • Windows server 2008 R2 IIS搭建ASP网站教程
  • Linux之基础开发工具gdb调试器的使用(三)
  • advanced-css: No.1
  • 最新宝塔面板第三方云端站点程序源码/第三方宝塔面板PHP源码/全开源ThinkPHP框架
  • 【Unity之UI编程】玩法面板的实现
  • 栈和队列:栈
  • 由浅入深学习统计学 - 常用统计图形学习
  • 【java进阶】集合的三种遍历(迭代器、增强for、Lambda)
  • Qt实现动态桌面小精灵(含源码)
  • Qt 自定义分页控件
  • Java中的7大设计原则
  • Spring Cloud和Kubernetes + Spring Boot 用哪个?
  • web-worker 基本使用
  • SpringBoot使用@PropertySource读取 properties 配置
  • 100天精通风控建模(原理+Python实现)——第5天:风控建模中数据标准化是什么?
  • find和grep命令的简单使用
  • 力扣:164. 最大间距(Python3)
  • 游戏平台采集数据
  • CSS让两个标签在同一行显示并自适应宽度
  • Leetcode154. Find Minimum in Rotated Sorted Array II