關于linux軟件編程12——網絡編程3

一、單循環服務器
特點:
1.可以處理多個客戶端 (不能同時)
2.效率不高

//單循環服務器:
socket
bind
listen
while (1)
{connfd =  accept();//通信 
}特點:簡單 可以處理多客戶端 不能同時 

二、并發服務器 ? ?--- 同時可以處理多個客戶端

1、設置一個選項(開啟一個功能) ---讓地址重用

int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
功能:設置socket的屬性參數:	 @sockfd   --- 要設置的socket @level    --- 設置socket層次 //socket本身 tcp ip @optname  --- 選項名字 @optval   --- 選項值 @optlen   --- 長度 設置一個選項(開啟一個功能) ---讓地址重用 地址重用:

//并發服務器 --- 同時處理多個客戶端?
socket
bind
listen
while (1)
{
connfd = ?accept();
//通信?
//進程
// ---專門創建一個子進程 --- 負責通信過程 ? ?
//線程
// ---專門創建一個線程 --- 負責通信過程 ??
}

//并發服務器 --- 同時處理多個客戶端 
socket
bind
listen
while (1)
{connfd =  accept();//通信 //進程// ---專門創建一個子進程 --- 負責通信過程    //線程// ---專門創建一個線程 --- 負責通信過程   
}

將兩個任務:
1.負責完成連接操作?
accept ??
2.負責通信的?

多進程 和 多線程

并發服務器 ---多進程方式的效率 肯定 低于 多線程

三、更高效的方式:多路IO復用

多路IO?
I ? --- input
O ? --- output
復用?
一個進程?
一個線程 可以處理多路IO?
//這多路IO 復用了這個一個進程 或是線程

比較:

//并發服務器 --- 同時處理多個客戶端?
socket
bind
listen
while (1)
{
connfd = ?accept();
//通信?
//進程
// ---專門創建一個子進程 --- 負責通信過程 ? ?
//線程
// ---專門創建一個線程 --- 負責通信過程 ??
}


//一路io
accept
//另一路io
負責通信

多路IO?
把負責通信的那個進程 或 線程?
用來處理多個客戶端的通信

/多進程或多線程的并發服務器

一個客戶端 ----> 一個進程 或 線程?


//IO多路復用?
N個客戶端 -----> 一個進程 或 線程

提高并發的能力

?? ??? ?socket ?
|
bind
|
listen
|
accept
|
do_client1 do_client2 ?do_client3


socket ?
|
bind
|
listen
|
accept
|
do_client1 ? do_client2 ?do_client3
| ? | ? |
cli1 cli2 cli3 cli4 cli5 cli6 cli7 cli8 cli9 ?

四、多路IO復用功能的相關函數

select
poll
epoll

五、IO處理的模型

阻塞IO模型:i -- 讀 scanfgetcharfgetsreadrecvo -- 寫寫有阻塞    //管道 讀端存在 寫管道

阻塞IO模型:

以讀為例:
讀操作--->內核中讀取數據--->如果沒有數據,一直等到,直到有數據--->之后將數據帶回到用戶空間 ?? ? ??
非阻塞IO模型:
以讀為例:
讀操作--->內核中讀取數據--->如果沒有數據,不等,直接返回用戶空間

阻塞 與 非阻塞 是操作對象的特性?

5.1設置非阻塞的函數 fcntl

//設置非阻塞 
fcntl
#include <unistd.h>
#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );
功能:維護文件描述符
參數:@fd  --- 要操作的fd@cmd --- 要做的一些操作 //command@... --- 可變參數 
返回值 取決于所做的操作 
int printf(const char *format, ...);printf("hello world!\n");
printf("a = %d\n",a);
printf("a = %d b = %c\n",a,b);設置非阻塞
int flags;
flags = fcntl(fd,F_GETFL,0); //讀 
flags = flags | O_NONBLOCK;  //修改 
fcntl(fd,F_SETFL,flags);     //寫 點對點聊天client  <----------> serverfgetswrite/send -----> recv/read printf fgetsread<------writeprintf

5.2信號驅動IO:

信號驅動IO//signal
1.fcntl  --- 設置 信號接受者 flags = fcntl(fd,F_GETFL); //獲得當前標志 fcntl(fd,F_SETFL,flags|O_ASYNC); O_ASYNC //開啟異步操作 //同步 //A->B//異步 //A//B
2.將該程序 和 SIGIO信號關聯起來 fcntl(fd,F_SETOWN,pid);//OWNER 
3.設置信號處理函數 signal(SIGIO)如果 程序要處理多路IO   缺點:處理的數量有限 

IO多路復用方式?
//可以處理多路IO?
//不需要 阻塞
//不需要 輪詢?

因此

六、IO多路復用方式:

6.1slect函數;

select 
0  --- 讀
1  --- 寫
2  --- 出錯int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);功能:實現IO多路復用 @nfds      //是關心的文件描述符中最大的那個文件描述符 + 1  
@readfds   //代表 要關心 的 讀操作的文件描述符的集合 
@writefds  //代表 要關心 的 寫操作的文件描述符的集合
@exceptfds //代表 要關心 的 異常的文件描述符的集合
@timeout   //超時 --- 設置一個超時時間 //NULL 表示select是一個阻塞調用 //設置時間 //         0 --- 非阻塞 //    n (>0) --- 阻塞n這么長時間 //注意: 這個值 每次 自動在往下減少 --直到減少到0struct timevalstruct timeval {long    tv_sec;         /* seconds */long    tv_usec;        /* microseconds */};struct timeval t = {0,0};返回值:成功 返回就緒的文件描述符的數量 失敗 -1 

6.2select函數使用的整體思路:

//select使用時的整體思路:
1.建立一張表  監控fd_set readfds; //一張表 			  FD_ZERO(&readfds); //清空這張表			  
2.將要監控的文件描述符 添加表中 FD_SET(0,&readfds);FD_SET(fd,&readfds);3. nfds = fd + 1; 
select(nfs,&readfds,NULL,NULL,NULL)void FD_CLR(int fd, fd_set *set); //將fd從set集合中清除 
int  FD_ISSET(int fd, fd_set *set);//判斷fd是否在set中 
void FD_SET(int fd, fd_set *set);//將fd添加到set集合中
void FD_ZERO(fd_set *set);//將set集合清空 

6.3使用:

多路IO復用的服務器: //實現并發 --- 可以同時處理多個客戶端listenfd = socket
bind
listen
//connfd = accept
//1.準備表fd_set readfds;FD_ZERO(&readfds);
//2.添加要監控的文件描述符 FD_SET(listenfd,&reafds);
//3.準備參數 maxfds = listenfd + 1;fd_set backfds; 
while (1)
{   backfds = readfds;int ret = select(maxfds,&backfds,NULL,NULL,NULL);if (ret > 0){int i = 0;for (i = 0; i < maxfds;++i){if (FD_ISSET(i,&backfds)){if (i == listenfd) //連接 {connfd = accept();//connfd 要被添加到 監控表FD_SET(connfd,&readfds);if (connfd + 1 > maxfds)maxfds = connfd + 1;}else //負責與客戶端通信 {//	i = ?//fd 此時就緒 printf("buf = %s\n",buf);if (strncmp(buf,"quit",4) == 0){FD_CLR(i,&readfds); //清除對應的客戶端的fdclose(i);	}}}}}
}//優化
int i = maxfds;
for (i = maxfds-1; i >= 0; --i)
{if (FD_ISSET(i,&readfds)){maxfds = i + 1;}
}

不足:? ?

?1. 最大監聽數受限:`FD_SETSIZE` 默認 1024(Linux)
2. 每次調用需重置 fd_set:內核會修改集合,必須每次重新 `FD_SET`
3. 用戶態與內核態拷貝開銷大
4. 返回后仍需遍歷所有 fd 才能知道哪個就緒
5. 效率隨 fd 數量增長下降明顯

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

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

相關文章

thinkphp6通過workerman使用websocket

安裝workerman依賴 composer require topthink/think-worker composer require topthink/think-worker1.0.* # 指定兼容版本?:ml-citation{ref"1,7" data"citationList"}config配置 config/worker.php <?php return [// 擴展自身需要的配置host …

Rust SQLx 開發指南:利用 Tokio 進行性能優化

在當今高并發的應用開發環境中&#xff0c;數據庫操作往往是性能瓶頸的主要來源之一。SQLx 作為一個純 Rust 編寫的異步 SQL 客戶端庫&#xff0c;通過與 Tokio 運行時深度集成&#xff0c;為開發者提供了處理數據庫 I/O 密集型操作的強大工具。本文將帶您深入了解如何利用這兩…

嵌入式硬件電路分析---AD采集電路

文章目錄摘要AD采集電路1AD采集電路2R77的真正作用是什么&#xff1f;理想與現實&#xff1a;為什么通常可以忽略R77的影響&#xff1f;摘要 AD采集 AD采集電路1 這是個人畫的簡化后的AD采集電路 這是一個AD檢測電路&#xff0c;R1是一個可變電阻&#xff0c;R2是根據R1的常用…

Python爬取nc數據

1、單文件爬取爬取該網站下的crupre.nc數據&#xff0c;如下使用requests庫&#xff0c;然后填寫網站的url&#xff1a;"http://clima-dods.ictp.it/regcm4/CLM45/crudata/"和需要下載的文件名&#xff1a;"crupre.nc"import requests import osdef downlo…

策略模式 + 工廠模式

策略模式&#xff1a;簡單來說解決的行為的封裝與選擇。如HandlerMapping&#xff0c;將 HTTP 請求映射到對應的處理器&#xff08;Controller 或方法&#xff09;。工廠模式&#xff1a;解決的是具有相同屬性的對象創建問題&#xff0c;如BeanFactory創建bean對象。解決的代碼…

Diamond基礎3:在線邏輯分析儀Reveal的使用

文章目錄1. 與ILA的區別2. 使用Reveal步驟3.Reveal注意事項4.傳送門1. 與ILA的區別 Reveal是Lattice Diamond集成開發環境用于在線監測信號的工具&#xff0c;ILA是xilinx的Vivado集成開發工具的在線邏輯分析儀&#xff0c;同Reveal一樣&#xff0c;均可以在項目運行過程中&am…

超適合程序員做知識整理的 AI 網站

這次要給大家分享一個超適合程序員做知識整理的 AI 網站 ——Notion AI&#xff0c;網址是Notion&#xff0c;它能把你隨手記的雜亂筆記、代碼片段、技術文檔&#xff0c;一鍵梳理成邏輯清晰的結構化內容&#xff0c;小索奇我用它整理 “Python 爬蟲知識點” 時&#xff0c;原本…

【 Selenium 爬蟲】2025年8月25日-pixabay 圖片采集

無惡意采集&#xff0c;取部分圖片用來做相冊測試的&#x1f604; 效果圖import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.la.selenium.utils.SeleniumUtil; import lombok.extern.slf4j.Slf4j; import o…

服務器托管需要注意什么事項?

服務器托管是企業IT基礎設施的關鍵環節&#xff0c;其穩定性和安全性直接影響業務連續性。需要注意下面這幾點&#xff01; 一、服務商與機房選擇 服務商資質 選擇持有ISP證書的合法服務商&#xff0c;優先考慮運營超5年、市場口碑佳的老牌公司&#xff0c;技術團隊需具備72…

微信小程序備忘

1.按鈕事件中想切換到tabBar中的鏈接用switchTab&#xff0c;不能用navigateTo&#xff1a;agentPage: function() { wx.switchTab({url: /pages/agent/agent}) },特別注意&#xff1a;微信小程序中所謂的自定義&#xff0c;并不是完全的自定義&#xff0c;在app.json中定義&a…

虛擬機NAT模式通過宿主機(Windows)上網不穩定解決辦法(無法上網)(將宿主機設置固定ip并配置dns)

文章目錄問題描述解決辦法分析**1. 問題的根本原因****(1) 宿主機動態IP的DNS配置問題****(2) NAT模式下的網絡依賴****(3) 自習室WiFi的潛在限制****2. 用戶操作的合理性分析****(1) 固定IP的作用****(2) 手動指定公共DNS的作用****3. 用戶懷疑的正確性****4. 其他可能原因的排…

基于 HTML、CSS 和 JavaScript 的智能圖像虛化系統

目錄 1 前言 2 技術實現 2.1 HTML&#xff1a;搭建頁面基礎結構 2.2 CSS&#xff1a;打造科技感視覺體驗 2.3 JavaScript&#xff1a;實現核心虛化功能 2.3.1 圖像上傳與初始化 2.3.2 實時虛化處理 2.3.3 圖像下載功能 3 完整代碼 4 運行結果 5 總結 1 前言 三大核…

PS更改圖像尺寸

新建文檔 1.左上角——新文件可以新建文檔2.文件——新建文檔3.快捷鍵CtrlN 對文件命名 輸入新文件名稱設置寬度和高度 設置文件的寬高&#xff0c;單位可以是像素、英寸、厘米等。還可以選擇文件方向或者是否使用畫板模式畫布背景色 一般顯示白色&#xff0c;也可以選擇其他顏…

分詞器詳解(一)

文章目錄&#x1f31f; 第0層&#xff1a;極簡版&#xff08;30秒理解&#xff09;核心公式生活比喻&#x1f4da; 第1層&#xff1a;基礎概念&#xff08;5分鐘理解&#xff09;1. 分詞器基礎1.1 分詞器的核心作用1.2 主流分詞算法對比2. 基礎實現2.1 BPE實現原理2.2 特殊標記…

推薦一個論文閱讀工具ivySCI

1.一些關于ivySCI的數據 &#xff08;摘自&#xff1a;吳焱紅&#xff0c;論文示范:ivySCI 在論文管理、閱讀和筆記中的體驗&#xff09; 1.科研人員花在文獻閱讀上的時間占總工作時間的 23%2.每年閱讀的文獻數量大概是 188 到 280 篇3.ivySCI 提供 Pad(iPad 和 Android) 和桌…

診斷服務器(Diagnostic Server)

在《SWS_Diagnostics.pdf》中,診斷服務器(Diagnostic Server) 是診斷管理(DM)的核心執行單元,聚焦 “軟件集群(SoftwareCluster)級診斷資源的獨立管控”,實現 UDS(ISO 14229-1)與 SOVD(ASAM 服務化診斷)的全流程診斷功能。以下結合文檔 7.3 節 “Diagnostic Serve…

如何開發一款高穩定、低延遲、功能全面的RTSP播放器?

一、引言&#xff1a;RTSP的價值與挑戰 RTSP&#xff08;Real-Time Streaming Protocol&#xff09;作為實時流媒體傳輸的核心協議&#xff0c;廣泛應用于安防監控、無人機回傳、教育互動、遠程醫療、單兵指揮等行業。它提供了 基于請求/響應機制的流媒體控制能力&#xff0c;…

數據結構——樹(03二叉樹,與路徑有關的問題,代碼練習)

文章目錄一、求二叉樹的值【層序遍歷實現】1.1右視圖1.2層最大值1.3層和1.4最底層的葉子結點的和1.5層平均值1.6最大層和的層號二、二叉樹的路徑2.1根節點到葉子節點&#xff0c;二叉樹的路徑2.2路徑的十進制之和 & 二進制之和2.3二叉樹里的路徑三、二叉樹的路徑23.1最長同…

Git配置:禁用全局HTTPS驗證

文章目錄Git配置&#xff1a;禁用全局HTTPS驗證什么是HTTPS驗證&#xff1f;為什么需要禁用HTTPS驗證&#xff1f;如何禁用全局HTTPS驗證&#xff1f;注意事項結論Git配置&#xff1a;禁用全局HTTPS驗證 在軟件開發和版本控制中&#xff0c;Git是一個不可或缺的工具。它幫助開…

【54頁PPT】基于DeepSeek的數據治理技術(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92796370/91778320 資料解讀&#xff1a;《基于DeepSeek的數據治理技術》 詳細資料請看本解讀文章的最后內容。 作為數據治理領域的資深研究者&#…