并發網路通信-套接字通信

套接字通信就是網絡通信

在網絡通信時,客戶端和服務器的比例是N:1

服務器如何處理多個客戶端的請求

并發處理方式

1.多線程并發處理->線程池并發處理,線程池可以對多個線程進行管理

2.多進程->進程池

3.io多路轉接,使用select或者epoch進行處理,使用io轉接函數,可以在單線程的情況下處理多個客戶端的請求,如果io轉接搭配多線程使用就可以大大提高工作效率

4.使用開源框架:livenent開源的網絡通信框架,天然支持高并發

客戶端業務流程復雜

需要同時進行軟件的上傳和下載,在這種情況下就需要和服務器端建立多個連接,這樣才能提高效率,就可以在客戶端創建一個套接字連接池,每個連接對應一個要處理的業務流程,因為發起了多個連接,每個連接都需要處理,這時候就需要使用多線程,因此套接字連接池和多線程是 搭配使用的,同樣的,也可以套接字連接池和線程池搭配使用

由于c++里面沒有用于通信的套接字類,需要基于c語言的api封裝出對應的用于通信的c++類

1.概念

局域網和廣域網

局域網:局域網將一定區域內的各種計算機、外部設備和數據庫連接起來形成計算機通信的私有網絡。
廣域網:又稱廣域網、外網、公網。是連接不同地區局域網或城域網計算機通信的遠程公共網絡。


 

ip:網絡協議。ip地址用來表示計算機在網絡中的地址

端口:用端口來標識進程地址

ip+端口就可以知道是哪臺電腦的哪個進程

iso/osi模型

應用層

表示層           應用層

會話層

傳輸層              傳輸層                                      tcp,udp  傳輸層協議

網絡層              網絡互聯層                                ip協議(ipv4,ipv6)

數據鏈路層               網絡接口層                          以太網幀協議(底層協議不需要搞明白,只需要搞明白對應的套接字接口怎么去調用,以及套接字通信的流程)

物理層

物理層:負責最后將信息編碼成電流脈沖或其它信號用于網上傳輸
數據鏈路層:
數據鏈路層通過物理網絡鏈路供數據傳輸。
規定了0和1的分包形式,確定了網絡數據包的形式;
網絡層
網絡層負責在源和終點之間建立連接;
此處需要確定計算機的位置,通過IPv4,IPv6格式的IP地址來找到對應的主機
傳輸層
傳輸層向高層提供可靠的端到端的網絡數據流服務。
每一個應用程序都會在網卡注冊一個端口號,該層就是端口與端口的通信
會話層
會話層建立、管理和終止表示層與實體之間的通信會話;
建立一個連接(自動的手機信息、自動的網絡尋址);
表示層:
對應用層數據編碼和轉化, 確保以一個系統應用層發送的信息 可以被另一個系統應用層識別;


 

網絡協議:全世界都認可的在網路通信過程中使用的一種數據的固定通信格式

 數據是怎么在計算機之間進行傳遞的

我們要發送的數據都是應用層的數據,應用層的數據可以使用應用層的協議(比如ftp,http)進行包裝,應用層包裝好之后繼續向下傳遞就到了傳輸層,傳輸層還需要繼續進行打包,打包之后還需要再次向下傳遞就到了網絡層,網絡層繼續向下傳遞就到了網絡接口層,數據再次打包得到一個報文,這個報文通過網口發送給對方,對方計算機接收到這個數據之后,先對網絡接口層的這個數據進行解包操作,解出來后就得到了網絡層的一個數據包,網絡層繼續向上傳遞就到了傳輸層,數據在傳輸層解剖繼續向上傳遞到達應用層,就需要由程序員去處理,先看看我們的數據有沒有被應用層的協議進行封裝,如果封裝了,程序員自己把他解開,比如基于http進行解包才能拿到原始數據。但如果沒有使用相關協議對應用層數據進行打包,那么我們從傳輸層拿到數據就是原始數據了,直接處理就可以了

應用層以下,程序員默認情況下不需要做任何處理的,這些都是由內核來完成的,我們只需要把應用層這個數據搞清楚就行了

應用層數據就兩種情況:1.不進行數據的打包

2.打包的數據 如果說對應用層的數據進行了封裝,接收到這個數據之后需要在應用層把這個數據按照發送端的協議格式再解開就能得到原始數據

在網絡通信的時候, 程序猿需要負責的應用層數據的處理(最上層)

應用層的數據可以使用某些協議進行封裝, 也可以不封裝

程序猿需要調用發送數據的接口函數,將數據發送出去

程序猿調用的API做底層數據處理

傳輸層使用傳輸層協議打包數據
網絡層使用網絡層協議打包數據
網絡接口層使用網絡接口層協議打包數據
數據被發送到internet
接收端接收到發送端的數據

程序猿調用接收數據的函數接收數據
調用的API做相關的底層處理:
網絡接口層拆包 ==> 網絡層的包
網絡層拆包 ==> 網絡層的包
傳輸層拆包 ==> 傳輸層數據
如果應用層也 使用了協議對數據進行了封裝,數據的包的解析需要程序猿做

套接字通信就是網絡通信就是socket通信

socket:研發的一套接口

問題:在發送端把數據封裝好后,肯定要把它先存到一塊內存中,然后再通過網絡進行發送,接收端收到這個數據后,也是要先把數據存到一塊內存中,然后再進行解析

如果發送端A和接收端B在內存中存儲數據的順序不一致(比如發送端從低地址位到高地址位存儲123456,而接收端可能是654321這樣),就會導致在接收端解析不出來發送端相同的數據

所以必須要求兩段在內存中處理數據的順序是一致的,即要制定一個規則,即指定數據在發送過程中的字節序(即數據在內存中的存儲順序)

字節序,顧名思義字節的順序,就是大于一個字節類型的數據在內存中的存放順序,也就是說對于單字符來說是沒有字節序問題的,字符串是單字符的集合,因此字符串也沒有字節序問題。

對于int long這些非單字節結構的數據類型,它們都需要由多個字節才能夠組成一個完整的整體

數據在內存中的存儲順序主要有兩種,分別是大端(網絡字節序)和小端(主機字節序),通常所用的pc機在內存中的存儲順序,就是按照小端的順序存儲的,在進行網絡通信的時候,數據是按照大端來存儲的,比如在套接字通信的時候發送的數據需要把數據從小端轉換成大端進行發送,接收到數據之后,還需要把大端轉換成小端在本地主機上進行存儲

小端(主機字節序):數據的低位字節存儲到低地址位,高位字節存儲到高地址位(低低高高)

大端(網絡字節序):相反(低高高低)

大小端相互轉換的操作函數

#include <arpa/inet.h>
// u:unsigned
// 16: 16位, 32:32位
// h: host, 主機字節序
// n: net, 網絡字節序
// s: short
// l: int
//這組函數主要是對16位和32位的整形數進行轉換
// 這套api主要用于 網絡通信過程中 IP 和 端口 的 轉換
// 將一個短整形從主機字節序 -> 網絡字節序
uint16_t htons(uint16_t hostshort);	
// 將一個整形從主機字節序 -> 網絡字節序
uint32_t htonl(uint32_t hostlong);	// 將一個短整形從網絡字節序 -> 主機字節序
uint16_t ntohs(uint16

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

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

相關文章

AI當前狀態:有哪些新技術

一、到目前為址AI領域出現的新技術 到目前為止&#xff0c;AI領域涌現了許多令人興奮的新技術。以下是一些關鍵的進展&#xff0c;涵蓋了從基礎模型到實際應用的多個方面&#xff1a; 1. 更強大的大型語言模型 (LLMs): 性能提升: 新一代LLM&#xff0c;例如OpenAI的GPT-4o和…

AI與IT的共生

AI并非“職業終結者”&#xff0c;而是IT從業者的“認知杠桿”。通過工具化協作、技能升級與倫理治理&#xff0c;人類可釋放創造力&#xff0c;探索量子計算、生物啟發算法等深水區。未來的IT行業將呈現“AI賦能人類&#xff0c;人類定義AI邊界”的共生格局。 一、AI如何改變…

swagger的簡介及使用方法

Swagger 是一個用于描述、生成、文檔化和測試 RESTful API 的開源工具集。它可以自動生成 API 文檔&#xff0c;幫助開發者理解和使用 API。Swagger 由 Swagger.io 提供&#xff0c;并已經發展成了一套廣泛應用于 API 設計和文檔的標準。 Swagger 項目的歷史可以追溯到 2010 年…

解決Flutter 2.10.5在升級Xcode 16后的各種報錯

Flutter 環境 Flutter version 2.10.5Dart version 2.16.2DevTools version 2.9.2CocoaPods version 1.16.2Xcode 16.3 問題一&#xff1a;XCResult parsing error: Error: This command is deprecated and will be removed in a future release, --legacy flag is required t…

Vue + Spring Boot 整合全解析

一、引言 在當今的Web開發領域&#xff0c;前后端分離架構已成為主流。Vue.js作為一款流行的前端框架&#xff0c;以其簡潔易用和高效的特點深受開發者喜愛&#xff1b;Spring Boot則是Java后端開發中快速構建應用的利器。將Vue和Spring Boot整合&#xff0c;能夠充分發揮兩者…

PDF.js 生態中如何處理“添加注釋\添加批注”以及 annotations.contents 屬性

我們來詳細解釋一下在 PDF.js 生態中如何處理“添加注釋”以及 annotations.contents 屬性。 核心要點&#xff1a;PDF.js 本身主要是閱讀器&#xff0c;不是編輯器 首先&#xff0c;最重要的一點是&#xff1a;PDF.js 的核心庫 (pdfjs-dist) 主要設計用于解析和渲染&#xf…

當HTTP遇到SQL注入:Java開發者的攻防實戰手冊

一、從HTTP請求到數據庫查詢:漏洞如何產生? 危險的參數拼接:Servlet中的經典錯誤 漏洞代碼重現: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String category = request.getParameter("…

【grafana原生告警中心配置飛書機器人告警】

在grafana中的connect point中使用webhook的方式推送到飛書&#xff0c;始終無法觸發告警&#xff0c;原因是grafana推送的格式飛書不識別&#xff0c;現有兩種方式 1.使用中轉服務 使用flask搭建一個服務&#xff0c;grafana告警先通過webhook發送到web服務中&#xff0c;格…

kafka集群認證

1、安裝Kerberos(10.10.10.168) yum install krb5-server krb5-workstation krb5-libs -y ? 查看版本 klist -V ? Kerberos 5 version 1.20.1 ? 編輯/etc/hosts 10.10.10.168 ms1 10.10.10.150 ms2 10.10.10.110 ms3 vim /etc/krb5.conf # Configuration snippets ma…

前端工程化之自動化測試

自動化測試 自動化測試為什么需要測試&#xff1f;什么時候需要考慮測試測試類型前端測試框架單元測試Jest 重點掌握項目示例package.jsonsrc/utils/math.tssrc/utils/math.test.ts進行測試jest.config.js覆蓋率直觀看覆蓋率coverage/lcov-report/index.html src/main.test.tst…

分布式系統核心原理

CAP定理與權衡實踐 CAP定理 一致性&#xff08;Consistency&#xff09; 強一致性&#xff1a;所有讀寫操作均基于最新數據&#xff08;如銀行轉賬&#xff09;。 最終一致性&#xff1a;數據副本經過一段時間后達到一致&#xff08;如社交媒體的點贊數&#xff09;。 技術實現…

Step文件無法編輯怎么辦?

Step文件無法編輯怎么辦&#xff1f; 這里介紹兩種方法&#xff0c; 1、 直接導入 準備step文件&#xff0c;solidworks導入后是這樣&#xff0c;不能在上面直接編輯 圖 1 點擊右鍵&#xff0c;選擇解除特征&#xff08;不同版本的可能不太一樣&#xff0c;這里是solidworks2…

TIM_ITConfig() 和 TIM_Cmd()

在STM32的定時器中斷配置中&#xff0c;TIM_ITConfig() 和 TIM_Cmd() 是兩個關鍵函數&#xff0c;它們分別控制中斷使能和定時器計數器的啟停&#xff0c;作用層級不同。以下是詳細解釋&#xff1a; 1. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE) 作用 啟用定時器的特定中斷…

TensorFlow 實現 Mixture Density Network (MDN) 的完整說明

本文檔詳細解釋了一段使用 TensorFlow 構建和訓練混合密度網絡&#xff08;Mixture Density Network, MDN&#xff09;的代碼&#xff0c;涵蓋數據生成、模型構建、自定義損失函數與預測可視化等各個環節。 1. 導入庫與設置超參數 import numpy as np import tensorflow as t…

數據結構實驗7.2:二叉樹的基本運算

文章目錄 一&#xff0c;實驗目的二&#xff0c;問題描述三&#xff0c;基本要求四&#xff0c;實驗操作五&#xff0c;示例代碼六&#xff0c;運行效果 一&#xff0c;實驗目的 深入理解樹與二叉樹的基本概念&#xff0c;包括節點、度、層次、深度等&#xff0c;清晰區分二叉…

直線軸承常規分類知多少?

直線軸承的分類方式多樣&#xff0c;以下是從材質、結構形狀和常規系列三個維度進行的具體分類&#xff1a; 按主要材質分類 外殼材質&#xff1a;常見的有不銹鋼&#xff0c;具有良好的耐腐蝕性&#xff0c;適用于一些對環境要求較高、易受腐蝕的工作場景&#xff1b;軸承…

websocket和SSE學習記錄

websocket學習記錄 websocket使用場景 即時聊天在線文檔協同編輯實施地圖位置 從開發角度來學習websocket開發 即使通信項目 通過node建立簡單的后端接口,利用fs&#xff0c; path&#xff0c; express app.get(*, (req, res) > {const assetsType req.url.split(/)[…

CUDA編程中影響性能的小細節總結

一、內存訪問優化 合并內存訪問&#xff1a;確保相鄰線程訪問連續內存地址&#xff08;全局內存對齊訪問&#xff09;。優先使用共享內存&#xff08;Shared Memory&#xff09;減少全局內存訪問。避免共享內存的Bank Conflict&#xff08;例如&#xff0c;使用padding或調整訪…

【雙指針】對撞指針 快慢指針 移動零

文章目錄 雙指針介紹對撞指針快慢指針283. 移動零解題思路算法思路算法流程雙指針介紹 ? 算法中的雙指針,并不一定是指我們平常在 c/c++ 使用的指針類型,更多時候其實是數組的下標等,因為它們也是有標識某個元素的功能,通常我們也就順其自然地稱其為 “指針” ! ? 常見…

數據結構0基礎學習堆

文章目錄 簡介公式建立堆函數解釋 堆排序O(n logn)topk問題 簡介 堆是一種重要的數據結構&#xff0c;是一種完全二叉樹&#xff0c;&#xff08;二叉樹的內容后面會出&#xff09;&#xff0c; 堆分為大小堆&#xff0c;大堆&#xff0c;左右結點都小于根節點&#xff0c;&am…