网络编程socket.close/output.close/socket.shutdownOutput区别与流程分析

文章目录

  • 三种方法效果的区别
  • 套接字Socket关闭与释放的区别
  • 服务器执行三种关闭操作后,继续发送/接收数据会发生什么
  • `socket.shutdownOutput` 关闭连接

找了半个小时没一个说明白的帖子,真的折磨

三种方法效果的区别

  • socket.close()Socket主动禁止输入和输出流,关闭Socket并丢弃所有的缓冲区未发送数据,发送FIN四次分手,等待关闭连接,释放Socket、输入输出流资源
  • output/input.close()只关闭本机上的输入/输出流,影响的是程序<--->接口这一段。Socket不会禁止输入/输出流操作,它不知道自己的输入/输出流已经关闭了。这是程序内部问题,双方Socket行为还是保持原样,但是会因为到达的数据没法交付给程序导致报错甚至崩溃
  • socket.shutdownOutput/Input()Socket主动禁止输入/输出流,发送FIN四次分手,等待关闭连接,释放Socket、输入/输出流等资源

综上,socket.close() 方法关闭整个Socket连接,禁止输入和输出操作,并且最终关闭连接和释放资源。output.close() 方法关闭输出流,禁止进一步的写操作,具体的影响取决于实现和是否与Socket关联。socket.shutdownOutput() 方法关闭Socket的输出流,禁止写操作,但允许继续使用输入流,发送FIN包通知对方关闭连接,并以四次握手过程完成连接关闭。

套接字Socket关闭与释放的区别

  1. 套接字的关闭(Socket Close):
    关闭套接字是指在网络通信结束或不再需要使用套接字时,显式地关闭套接字连接。通过调用套接字对象的 close() 方法,可以关闭套接字。关闭套接字后,不再能够进行数据传输,连接也被终止。关闭套接字是网络编程中常用的操作,用于释放与远程主机的连接以及清理资源。

  2. 套接字资源的释放(Socket Resource Release):
    套接字资源的释放是指在关闭套接字后,操作系统或编程语言运行环境会自动回收与套接字相关的资源。这些资源包括分配给套接字的内存空间、操作系统中的套接字句柄、网络协议栈中的缓冲区等。套接字资源的释放由操作系统或运行环境负责处理,通常会在套接字关闭后的一段时间内完成。

总结来说,关闭套接字是由程序显式调用的操作,用于结束连接并停止数据传输。而套接字资源的释放是随后由操作系统或运行环境自动进行的过程,用于回收之前使用的资源。关闭套接字是触发套接字资源释放的条件之一。

服务器执行三种关闭操作后,继续发送/接收数据会发生什么

当服务器执行 socket.close()output.close()socket.shutdownOutput() 操作后,如果客户端试图向服务器发送数据,将会发生以下情况:

  1. 服务器执行 socket.close() 后:

    • 服务器Socket被关闭,无法接收客户端发送的数据。
    • 客户端的发送操作将失败,并且可能引发异常(如连接错误或连接重置RST)。 在网络层面,当客户端尝试发送数据时,其操作系统会报错连接已关闭。
  2. 服务器执行 output.close() 后:

    • 客户端可以成功发送数据到服务器,并且服务器仍然可以通过输入流接收来自客户端的数据。只是服务器无法通过输出流向客户端发送任何数据(报错输出流已释放)。
  3. 服务器执行 socket.shutdownOutput() 后:

    • Socket的输入端仍然是打开状态,而输出端被关闭。这意味着Socket可以继续接收来自对方的数据,但无法再向对方发送数据。
  4. 服务器执行 input.close() 后:

    • 客户端可以成功发送数据到服务器,但服务器没法接收数据了,因为输入流已经释放掉了,数据会卡在Socket那步
  5. 服务器执行socket.shutdownInput()后:

    • 客户端会收到服务器发来的FIN,就不会给服务器发数据了。如果非要发,就会引发异常和错误

socket.shutdownOutput 关闭连接

此种TCP四次分手过程:

  1. 服务器socket.shutdownOutput向客户端发送第一个FIN,并关闭输出流。
  2. 客户端接收到服务器的FIN后,发送一个ACK确认收到,并进入TIME_WAIT状态。
  3. 客户端发送第二个FIN,并关闭输出流。
  4. 服务器接收到客户端的FIN后,发送一个ACK确认收到,并关闭Socket。
  5. 客户端在收到服务器的ACK后,会等待一段时间(2MSL),确保服务器收到了自己刚刚发的正确地ACK并关闭Socket。这段时间被称为2MSL(两倍最大报文生存时间)

ps.在TCP协议中,FIN和ACK报文是用来控制连接状态的特殊报文,它们不受Socket输出流的影响。当服务器调用 socket.shutdownOutput() 方法后,它会关闭自己的输出流,但仍然可以发送ACK报文来响应客户端的FIN报文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP外包开发原生和H5的区别

原生开发和H5开发是两种不同的方法&#xff0c;用于创建移动应用程序。它们具有各自的特点、优势和劣势&#xff0c;适用于不同的应用场景。以下是原生开发和H5开发之间的一些主要区别&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

DELETE 与TRUNCATE区别

DELETE 与TRUNCATE区别 要清空 PostgreSQL 中的表数据&#xff0c;可以使用 DELETE 或 TRUNCATE 语句。下面是两种方法的示例&#xff1a; 使用 DELETE 语句清空表数据&#xff1a; DELETE FROM 表名;例如&#xff0c;要清空名为 users 的表数据&#xff1a; DELETE FROM u…

未来公文的智能化进程

随着技术的飞速发展&#xff0c;公文——这个有着悠久历史的官方沟通方式&#xff0c;也正逐步走向智能化的未来。自动化、人工智能、区块链...这些现代科技正重塑我们的公文制度&#xff0c;让其变得更加高效、安全和智慧。 1.语义理解与自动生成 通过深度学习和NLP&#xff…

14-案例:购物车

综合案例-购物车 需求说明: 1. 渲染功能 v-if/v-else v-for :class 2. 删除功能 点击传参 filter过滤覆盖原数组 3. 修改个数 点击传参 find找对象 4. 全选反选 计算属性computed 完整写法 get/set 5. 统计 选中的 总价 和 数量 计算属性conputed reduce条件求和 6. 持久化到本…

电子商务公开密钥加密法

(一)定义与应用原理 公开密钥加密法是针对私有密钥加密法的缺陷而提出来的。是电子商务应 用的核心密码技术。所谓公开密钥加密&#xff0c;就是指在计算机网络上甲、乙两用户之间 进行通信时&#xff0c;发送方甲为了保护要传输的明文信息不被第三方窃取&#xff0c;采用密…

从零基础到精通IT:探索高效学习路径与成功案例

文章目录 导语&#xff1a;第一步&#xff1a;明确学习目标与方向选择适合的IT方向设定具体的学习目标咨询和调研 第二步&#xff1a;系统学习基础知识选择适合的编程语言学习数据结构和算法掌握操作系统和计算机网络基础 第三步&#xff1a;实践项目锻炼技能选择合适的项目编写…

聊一下操作系统 macOS 与 Linux

对于Windows操作系统大家都比较熟悉&#xff0c;也常拿它与Linux操作系统进行比较&#xff0c;两者之间的差异也很明显。但对于macOS 和 Linux的比较不太多&#xff0c;很多人认为它们很相似&#xff0c;因为这两种操作系统都可以运行 Unix 命令。其实详细比较下&#xff0c;两…

Redis——哨兵模式(docker部署redis哨兵)+缓存穿透和雪崩

哨兵模式 自动选取主机的模式。 概述 主从切换技术的方法是:当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干预&#xff0c;费事费力&#xff0c;还会造成段时间内服务不可用。这不是一种推荐的方式&#xff0c;更多时候&…

前端开发怎么解决性能优化的问题? - 易智编译EaseEditing

前端性能优化是确保网站或应用在加载速度、响应性和用户体验等方面达到最佳状态的关键任务。以下是一些解决前端性能优化问题的方法&#xff1a; 压缩和合并代码&#xff1a; 压缩和合并CSS、JavaScript和HTML文件可以减少文件大小&#xff0c;加快加载速度。使用压缩工具&am…

【Linux】Linux下常用查看文件指令小结

0x00 前言 版本信息&#xff1a;Ubuntu 18.04.6 LTS 最后更新日期&#xff1a;2023.8.18 0x01 Linux下常用查看文件指令小结 cat file &#xff1a;显示文件内容&#xff0c;支持-n选项&#xff0c;即cat -n file&#xff0c;表示加行号显示文件内容&#xff0c;不过不适合看…

vue vs react

vue 简介&#xff1a;渐进式 JavaScript 框架 来源&#xff1a;最初由 Evan You &#xff08;尤雨溪&#xff09;于2014年开发。Evan You之前在Google研究过AngularJS&#xff0c;并提取了Angular的部分特性以提供一个更轻量级的框架 版本&#xff1a; vue 1x&#xff1a;2014…

协同过滤推荐算法-基于Django+mysql的智能水果销售系统设计(可做计算机毕设)

随着科技的不断发展&#xff0c;智能化已经成为各行各业的趋势&#xff0c;水果销售行业也不例外。智能水果销售系统就是应运而生的一种智能化解决方案&#xff0c;它可以为用户提供更加便捷、高效的购物体验。其中&#xff0c;系统模块是智能水果销售系统的重要组成部分。 系…

tsconfig.json

概念 tsconfig.json所在位置是ts项目的根目录&#xff0c;他的主要作用是自定义配置不同的选项来告诉编译器如何编译当前项目。 重要属性 compilerOptions - 主要用来配置目标js版本&#xff08;target&#xff09;、模块解析方式&#xff08;moudle&#xff09;、输出目录&am…

python实现文字转语音

文字转语音 简介 pyttsx3是一个Python库&#xff0c;用于文字转语音的功能。它可以将文本转换为语音&#xff0c;并使用不同的音频引擎进行输出。这个教程将向您介绍如何使用pyttsx3来创建自定义的语音应用程序。 安装 使用以下命令安装pyttsx3库&#xff1a; pip install…

unet pytorch

1.单机多卡版本&#xff1a;代码中的DistributedDataParallel (DDP) 部分对应单机多卡的分布式训练方式 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torch.utils.data import Dataset, DataLoader from torchvisi…

ArcPy将矢量属性表批量转换为Excel文件

要使用ArcPy将矢量属性表批量转换为Excel文件&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 导入所需的Python库&#xff1a; import arcpy import pandas as pd 2. 设置工作空间和要素类路径&#xff1a;将arcpy.env.workspace设置为包含要素类的工作空间路径&…

【Apollo学习笔记】—— Planning模块

前言 本文记录学习planning模块时的一些笔记&#xff0c;总体流程参照https://zhuanlan.zhihu.com/p/61982682中的流程图&#xff0c;如上图所示。 planning_component modules/planning/planning_component.cc PlanningComponent::Init部分首先完成规划模式的选择&#xff…

【Linux】POSIX信号量和基于环形队列的生产消费者模型

目录 写在前面的话 什么是POSIX信号量 POSIX信号量的使用 基于环形队列的生产消费者模型 写在前面的话 本文章主要先介绍POSIX信号量&#xff0c;以及一些接口的使用&#xff0c;然后再编码设计一个基于环形队列的生产消费者模型来使用这些接口。 讲解POSIX信号量时&#x…

记K8S集群工作节点,AnolisOS 8.6部署显卡驱动集成Containerd运行时

1、安装gcc #安装编译环境 yum -y install make gcc gcc-c2、下载显卡驱动 点击 直达连接 nvidia高级搜索下载历史版本驱动程序&#xff08;下载历史版本驱动&#xff09; https://www.nvidia.cn/Download/Find.aspx?langcn3、安装驱动 安装显卡驱动 ./NVIDIA-Linux-x86…

windows结束explorer进程后桌面白屏解决

背景 结束进程时一不小心一起删掉explorer.exe &#xff0c;这个文件结束桌面就一片白 &#xff0c; 解决&#xff1a; 不要关机&#xff0c;同时按键盘上ctrlshiftesc ,重新进入任务管理器&#xff0c;接着点“进程”选项&#xff0c;按左上角文件选项&#xff0c;进入下拉菜单…