網絡編程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.pswp.cn/news/41902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41902.shtml
英文地址,請注明出處:http://en.pswp.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;進入下拉菜單…