C++ 網絡編程

一、Reactor 網絡編程模型

  • reactor 是一個事件處理模型。
  • 網絡處理:因為用戶層并不知道 IO 什么時候就緒,所以將對 IO 的處理轉化為對事件的處理
  • 網絡模型構成:
    • 非阻塞 IO操作 IO,如果 IO 未就緒,IO 函數會立刻返回
    • IO 多路復用:檢測多路 IO 是否就緒
  • 工作流程:
    • 注冊事件:
      • acceptlistenfd 注冊讀事件,如果讀事件被觸發了,說明 IO 就緒了,有新的客戶端跟我們建立連接,那么處理事件的時候就可以直接調用 accept()
      • connect:服務器作為客戶端去連接 MySQLconnectfd 注冊寫事件,如果寫事件被觸發了,說明連接建立成功了。
      • readclientfd 注冊讀事件,如果讀事件被觸發了,說明讀緩沖區中有數據了(客戶端發送數據了),我們再調用 read() 去讀緩沖區中讀數據。accept 返回 clientfd
      • writeclientfd 注冊寫事件,如果寫事件被觸發了,說明寫緩沖區中有空間可以寫數據,我們再調用 write() 往寫緩沖區中寫數據。
      • 被動斷開連接:clientfd 注冊讀 / 寫事件read = 0 可以判斷連接已經斷開了,write = -1 && errno = EPIPE 也可以判斷連接已經斷開了。
    • 處理事件:事件觸發后,說明 IO 就緒了,處理相對應的 IO
  • 封裝流程:
    • 事件對象:http_conn 連接、listenfd、不同事件的回調函數。
    • 事件控制接口:注冊事件接口、注銷事件接口。
    • 事件循環:不斷檢測并發就緒的事件。

二、Reactor 和 Proactor 的區別

  • 本質區別:IO 操作不同,reactor 中先檢測 IO 是否就緒,然后再操作 IO;proactor 只需要投遞請求,所有 IO 操作由內核完成
  • reactor 是同步 IO 網絡模型
    • 具體 IO 操作通過非阻塞 IO 來完成。
    • 具體 IO 是否就緒,由 IO 多路復用來完成。
  • proactor 是異步 IO 網絡模型
    • 具體 IO 檢測和 IO 操作都由內核完成
  • 同步 IO異步 IO 的區別:
    • 同步 IOIO 函數調用后,立刻能獲知 IO 操作的結果在這里插入圖片描述
    • 異步 IO異步 IO 函數調用后,不能獲知 IO 操作的結果,此時 IO 操作都由內核完成
  • 阻塞 IO非阻塞 IO 的區別:
    • IO 未就緒時,IO 函數是否立刻返回:立刻返回是非阻塞 IO;阻塞等待是阻塞 IO
    • IO 函數的第一個參數,也就是具體的 fd 來決定,默認情況下,fd 是阻塞的,可修改為非阻塞。
  • IOCP
    • CreateIoCompletionPort:創建一個完成端口。
    • 創建 socketbindlisten,將該 socket 綁定到完成端口上。
    • 根據 CPU 核心數創建工作線程,將完成端口傳遞到工作線程。
      • 工作線程調用 GetQueuedCompletionStatus 等待 IO 完成。
      • 處理業務邏輯(界定數據包)。
    • 投遞 IO 請求 AcceptExRecvExSendEx 到完成端口上。

三、連接斷開有幾種判定方式

  • 服務器主動斷開:主動調用 close()
  • 服務器被動斷開:
    • 客戶端主動調用
      • close():關閉讀端和寫端。
      • shutdown():關閉讀端或寫端,或都關閉。
    • 客戶端直接退出。
  • IO 網絡模型:
    • read = 0:讀端關閉。(recv 第四個參數為 0 的時候和 read 等價)
    • write = -1 && errno = EPIPE:寫端關閉。

在這里插入圖片描述

  • IO 多路復用模型:
    • EPOLLRDHUP:讀端關閉。
    • EPOLLHUP:讀寫端都關閉。
  • reactor 網絡模型:
    • 非阻塞 IO 可以用 IO 網絡模型來判斷連接是否斷開。
    • 也可以通過 IO 多路復用模型來判斷連接是否斷開。
  • proactor 網絡模型:

四、接收客戶端連接有幾種方式

  • 前提:服務端已經創建了 socket,且該 socket 綁定在某個地址上(bind),且該 socket 已經監聽(listen)。
  • 阻塞的 IO 網絡模型:
    • 獲知連接的唯一文件描述符。
    • 獲知連接的 IP 地址。
    • 以阻塞線程的方式實現接收連接。
    int clientfd = accept(socket, &addr, sizeof(addr));
    
  • 非阻塞的 IO 網絡模型:
    • 如果接收到,就跟阻塞的 IO 表現一樣。
    • 如果沒有接收到,clientfd = -1errnoEWOULDBLOCK
    • 嘗試一次接收連接。
    int clientfd = accept(socket, &addr, sizeof(addr));
    
  • reactor 網絡模型:
    • 需要把 listenfd 注冊它的讀事件。
    • 如果在事件循環中檢測到 listenfd 的讀事件,說明連接建立的 IO 已經就緒。
    • 此時調用非阻塞 IO accept 函數,將得到連接的 clientfdIP 地址。
    • 把接收連接抽象成一個事件。
  • proactor 網絡模型:
    • 投遞 accept 請求:調用 AcceptEx 函數,傳遞一個重疊結構。
    • 在工作線程中調用 GetQueueCompletionStatus 獲取 IO 完成的結果。
    • 如果有 IO 完成的事件,通過上面的函數可以獲取重疊結構,從而知道具體是什么請求。
    • proactor 是異步 IO 處理?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14647.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【從零開始實現stm32無刷電機FOC】【理論】【1/6 電機旋轉本質】

目錄 電機旋轉需要什么樣的力?怎么產生力矢量?怎么產生任意的線圈磁矢量? 電機旋轉需要什么樣的力? 電機切向存在受力,電機就會旋轉。 進一步查看電機結構,分為轉子和定子,大部分情況下&#…

Spark的概述、核心、組成、運行模式

一、Spark概述 Apache Spark 是一個快速的, 多用途的集群計算系統, 相對于 Hadoop MapReduce 將中間結果保存在磁盤中, Spark 使用了內存保存中間結果, 能在數據尚未寫入硬盤時在內存中進行運算。Spark 是一個計算框架,可以用來代替Hadoop中的MapReduce計算框架。 二…

FIFO-Diffusion,一個無需額外訓練即可生成長視頻的框架。通過確保每個幀引用足夠多的先前幀來生成高質量、一致的長視頻。

簡單來講,FIFO-Diffusion先通過一些模型如VideoCraft2、zeroscope、Opem-Sora Plan等與FIFO-Diffusion的組合生成短視頻,然后取結尾的幀(也可以取多幀),再用這一幀的圖片生成另一段短視頻,然后拼接起來。FI…

【MySQL精通之路】存儲引擎-MySQL8.0中的差異

存儲引擎是MySQL組件,用于處理不同表類型的SQL操作。 InnoDB是默認的、最通用的存儲引擎,Oracle默認使用其創建表。(MySQL 8.0中的CREATE TABLE語句默認創建InnoDB表。) MySQL Server使用可插拔存儲引擎體系結構,使存儲…

linux命令日常使用思考

linux命令日常使用思考 復制的相關問題scp和cp的區別root192.168.5.229-r的理解 更新版本的相關問題svn info 根目錄和家目錄的區別根目錄家目錄 復制的相關問題 scp和cp的區別 安全性:SCP 是基于 SSH 的加密傳輸協議,可以保證數據在傳輸過程中的安全性…

vue期末復習選擇題1

1. 下面哪一項描述是錯誤的?(B) A.$("ul li:gt(5):not(:last)")選取ul標記里面索引值大于5且不是最后一個的li元素B.$("div").find("span")選取div元素的子元素spanC.$("div.showmore > a")選取…

Axure RP 9 for Mac/win:重新定義交互原型設計的未來

在當今數字化時代,交互原型設計已成為產品開發中不可或缺的一環。Axure RP 9作為一款功能強大的交互原型設計軟件,憑借其出色的性能和用戶友好的界面,贏得了廣大設計師的青睞。 Axure RP 9不僅支持Mac和Windows兩大主流操作系統,…

Excel實現將A列和B列的內容組合到一個新的列(例如C列)中,其中A列的每個值都與B列的所有值組合。

利用Excel中vba代碼宏實現 原始數據: 自動生成后數據: vba實現代碼: Sub CombineColumns()Dim ws As WorksheetDim lastRowA As Long, lastRowB As Long, i As Long, j As LongDim MyIndex As IntegerDim strCombine As String, strColA As…

主流容器工具對比以及重點推薦學習的企業級工具

常見的主流容器工具包括但不限于以下幾種: 1. Docker: Docker 是最流行的容器平臺之一,它允許開發者將應用及其依賴打包到一個輕量級、可移植的容器中,然后可以在任何支持Docker的系統上運行。 2. Kubernetes:Kubern…

【Python】 去除字符串中的所有空白字符

基本原理 在Python中,字符串(String)是不可變的數據類型,這意味著一旦創建了一個字符串,就不能修改它的內容。然而,我們可以創建一個新的字符串,它包含原始字符串中的字符,但不包含…

局域網傳文件怎么操作?輕松實現文件共享!

在現代的辦公和生活中,局域網傳文件已經成為一種非常常見和方便的方式,可以快速、安全地在局域網內進行文件傳輸。無需依賴互聯網,局域網傳文件可以幫助團隊成員之間共享文件、備份數據、進行協作等。本文將介紹三種常見的方法,幫…

MySQL——存儲過程,觸發器

BaiduComate: # 問題1: # 問題1: 幫我創建兩個表student與score表,要求student表有id,createDate,userName,phone,age,sex,introduce, 要求score表有id&…

Vue3實戰Easy云盤(四):使用空間+文件預覽+文件分享+文件下載

一、空間使用 Framework.vue中 (1)引入接口 const api {getUseSpace: "/getUseSpace",logout: "/logout", }; (2)回調 // 使用空間 const useSpaceInfo ref({ useSpace: 0, totalSpace: 1 }); const g…

達夢數據庫和Oracle對比

達夢數據庫和Oracle對比 達夢數據庫(DM)是中國自主研發的一款數據庫管理系統,在功能和應用上與 Oracle 數據庫有諸多類似,但也有其獨特的特點。以下是對達夢數據庫(DM)和 Oracle 數據庫的詳細對比&#xf…

unreal engine 5.0.3 創建游戲項目

根據虛幻官網介紹,虛幻引擎5可免費用于創建線性內容、定制項目和內部項目。你可以免費用它開發游戲,只有當你的產品營收超過100萬美元時,才收取5%的分成費用。所以目前國內也有許多游戲廠商在使用UE制作游戲。UE5源碼也已開源,有U…

[數據集][目標檢測]吸煙檢測數據集VOC+YOLO格式1449張1類別

數據集格式:Pascal VOC格式YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數):1449 標注數量(xml文件個數):1449 標注數量(txt文件個數):1449 標注…

huggingface筆記:LLama 2

1 前提tip 1.1 使用什么數據類型訓練模型? Llama2模型是使用bfloat16訓練的 上傳到Hub的檢查點使用torch_dtype float16,這將通過AutoModel API將檢查點從torch.float32轉換為torch.float16。在線權重的數據類型通常無關緊要,這是因為模型…

QT 使用QZipWriter進行文件壓縮

目錄 1、QZipWriter 2、主要功能 3、示例 1、QZipWriter QZipWriter 是 Qt 提供的一個類,用于創建和管理 ZIP 文件。它屬于 Qt 的 QtGui 模塊,雖然在 Qt 6 中已經被移除,但在早期的 Qt 版本中,它被用作一種簡便的方式來創建 ZI…

CMMI模型的分析

CMMI模型的分析 CMMI(Capability Maturity Model Integration,能力成熟度模型集成)是由美國卡內基梅隆大學軟件工程研究所(SEI)開發的一個過程級改進訓練和評估程序。CMMI模型為組織提供了一套綜合的指南,用于改進其過程和提升性能。 CMMI 3.0是CMMI模型的最新版本,于…

AWS計算之AWS Elastic Beanstalk

AWS Elastic Beanstalk是一項用于簡化應用程序部署和管理的托管服務。它允許開發人員上傳他們的應用程序代碼,并自動處理底層的部署、擴展、負載均衡和監控任務,從而使開發人員能夠專注于應用程序的開發而不必擔心基礎架構的管理細節。 借助Elastic Bea…