Socket多路復用網絡編程應用總結

Socket多路復用網絡編程應用總結

概述

? 傳統I/O模型的局限性:傳統阻塞式I/O模型每次僅在一個文件描述符(File Descriptor, FD)上執行I/O操作,導致程序需等待單個操作完成,無法高效處理多連接場景(如高并發服務器)。
? 多路復用核心目標:通過非阻塞方式同時監控多個FD的狀態(可讀、可寫、異常),避免進程因等待某個FD而阻塞,提升I/O效率。


Select技術
核心特點
  1. 非阻塞輪詢:通過輪詢機制主動檢測FD集合的狀態變化,無需阻塞等待單個FD。
  2. 多路復用機制:單線程/進程可管理多個I/O操作,適用于非阻塞式網絡編程。
  3. 通用性:支持跨平臺(Linux/Windows),但性能在大規模FD時受限。
Select函數詳解
#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

? 參數
? nfds: 監控的FD最大值+1(如監控FD=5,則nfds=6)。
? readfds/writefds/exceptfds: 可讀、可寫、異常事件的FD集合。
? timeout: 超時時間(NULL表示阻塞,0表示非阻塞,>0為等待時間)。
? 返回值
? 成功:就緒的FD總數。
? 超時:返回0。
? 錯誤:返回-1,錯誤碼存于errno

關鍵宏操作

? FD_ZERO(fd_set *set): 清空集合。
? FD_SET(int fd, fd_set *set): 添加FD到集合。
? FD_CLR(int fd, fd_set *set): 從集合移除FD。
? FD_ISSET(int fd, fd_set *set): 檢查FD是否就緒。


編程流程
  1. 初始化FD集合

    fd_set read_fds;
    FD_ZERO(&read_fds);  // 清空集合
    FD_SET(sockfd, &read_fds); // 添加待監控的FD
    int max_fd = sockfd; // 記錄最大FD
    
  2. 調用Select

    struct timeval timeout = {5, 0}; // 5秒超時
    int ready = select(max_fd + 1, &read_fds, NULL, NULLtimeout);
    
  3. 處理結果
    ? 錯誤處理:檢查ready == -1,處理信號中斷或錯誤。
    ? 超時處理ready == 0時執行超時邏輯。
    ? 就緒處理:遍歷所有FD,使用FD_ISSET檢測就緒的FD:

    for (int fd = 0; fd <= max_fd; fd++) {if (FD_ISSET(fd, &read_fds)) {if (fd == sockfd) { // 處理新連接} else { // 處理客戶端數據}}
    }
    
  4. ****:每次調用select后需重新初始化FD集合(因內核會修改集合)。


Select模型關鍵點
  1. 位掩碼機制fd_set通過位掩碼表示FD集合(如FD=5對應第5位),最大FD數受FD_SETSIZE限制(通常1024)。
  2. 性能瓶頸:需遍歷所有FD,時間復雜度為O(n),不適用于海量連接。
  3. 適用場景:中小規模并發、跨平臺兼容性要求高的情況。

實例場景(服務器端)
  1. 監聽Socket:主Socket監聽連接請求(如TCP端口)。
  2. 接受新連接:當select返回主Socket可讀時,調用accept接收客戶端連接,并將新FD加入監控集合。
  3. 處理數據:遍歷所有FD,若某個客戶端FD可讀,調用recv讀取數據并處理。
  4. 異常處理:監控exceptfds處理連接異常(如斷開)。

優缺點總結

? 優點
? 跨平臺支持。
? 代碼簡單,適合低并發場景。
? 缺點
? FD數量受限(FD_SETSIZE)。
? 每次調用需復制FD集合到內核,遍歷開銷大。
? 需頻繁重置FD集合。


替代技術

? epoll(Linux):高效的事件通知機制,支持海量連接。
? kqueue(BSD/macOS):類似epoll,適用于BSD系統。
? IOCP(Windows):異步I/O模型,適用于Windows高性能服務器。


通過掌握select技術,開發者能夠編寫高效的非阻塞網絡程序,理解其原理及局限性可為后續學習更高效的多路復用技術(如epoll)奠定基礎。

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

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

相關文章

安卓開發提示Android Gradle plugin錯誤

The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模塊級 build.gradle&#xff08;如果有獨立配置&#xff09;&#xff1a;…

【C++初階】--- vector容器功能模擬實現

1.什么是vector&#xff1f; 在 C 里&#xff0c;std::vector 是標準模板庫&#xff08;STL&#xff09;提供的一個非常實用的容器類&#xff0c;它可以看作是動態數組 2.成員變量 iterator _start;&#xff1a;指向 vector 中第一個元素的指針。 iterator _finish;&#x…

分布式鎖在秒殺場景中的Python實現與CAP權衡

目錄 一、分布式鎖的前世今生 二、秒殺系統的 “硬核” 挑戰 三、Python 實現分布式鎖的 “實戰演練” Redis 實現:快準狠 ZooKeeper 實現:穩如老狗 數據庫實現:老實本分 四、CAP 理論的 “三角戀” 五、性能優化的 “錦囊妙計” 鎖粒度控制:粗細有道 超時機制:別…

企業級開發SpringBoost玩轉Elasticsearch

案例 Spring Boot 提供了 spring-data-elasticsearch 模塊&#xff0c;可以方便地集成 Elasticsearch。 下面我們將詳細講解如何在 Spring Boot 中使用 Elasticsearch 8&#xff0c;并提供示例代碼。 1. 添加依賴: 首先&#xff0c;需要在 pom.xml 文件中添加 spring-data-e…

磐石云智能語音客服系統——技術革新引領服務新體驗

在人工智能技術飛速發展的今天&#xff0c;企業對于智能化客戶服務的需求日益增長。磐石云智能語音客服系統憑借其前沿技術架構與深度場景適配能力&#xff0c;正在重新定義人機交互的邊界。本文將深入解析該系統如何通過技術創新實現服務效率與體驗的雙重突破。 一、意圖識別…

OpenGL學習筆記(assimp封裝、深度測試、模板測試)

目錄 模型加載Assimp網格模型及導入 深度測試深度值精度深度緩沖的可視化深度沖突 模板測試物體輪廓 GitHub主頁&#xff1a;https://github.com/sdpyy1 OpenGL學習倉庫:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppL…

通過AWS EKS 生成并部署容器化應用

今天給大家分享一個實戰例子&#xff0c;如何在EKS上創建容器化應用并通過ALB來發布。先介紹一下幾個基本概念&#xff1a; IAM, OpenID Connect (OIDC) 2014 年&#xff0c;AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的聯合身份支持。此功能允許…

入侵檢測snort功能概述

1. 數據包嗅探與日志記錄 網絡流量監控&#xff1a;實時捕獲和分析網絡數據包&#xff08;支持以太網、無線等&#xff09;。 日志記錄&#xff1a;將數據包以二進制格式&#xff08;pcap&#xff09;或文本格式存儲&#xff0c;供后續分析。 2. 協議分析與解碼 深度協議解析…

【Easylive】定時任務-每日數據統計和臨時文件清理

【Easylive】項目常見問題解答&#xff08;自用&持續更新中…&#xff09; 匯總版 這個定時任務系統主要包含兩個核心功能&#xff1a;每日數據統計和臨時文件清理。下面我將詳細解析這兩個定時任務的實現邏輯和技術要點&#xff1a; Component Slf4j public class SysTas…

藍橋杯 15g

班級活動 問題描述 小明的老師準備組織一次班級活動。班上一共有 nn 名 (nn 為偶數) 同學&#xff0c;老師想把所有的同學進行分組&#xff0c;每兩名同學一組。為了公平&#xff0c;老師給每名同學隨機分配了一個 nn 以內的正整數作為 idid&#xff0c;第 ii 名同學的 idid 為…

如何使用AI輔助開發R語言

R語言是一種用于統計計算和圖形生成的編程語言和軟件環境&#xff0c;很多學術研究和數據分析的科學家和統計學家更青睞于它。但對與沒有編程基礎的初學者而言&#xff0c;R語言也是有一定使用難度的。不過現在有了通義靈碼輔助編寫R語言代碼&#xff0c;我們完全可以用自然語言…

CISCO組建RIP V2路由網絡

1.實驗準備&#xff1a; 2.具體配置&#xff1a; 2.1根據分配好的IP地址配置靜態IP&#xff1a; 2.1.1PC配置&#xff1a; PC0&#xff1a; PC1&#xff1a; PC2&#xff1a; 2.1.2路由器配置&#xff1a; R0&#xff1a; Router>en Router#conf t Enter configuration…

React + TipTap 富文本編輯器 實現消息列表展示,類似Slack,Deepseek等對話框功能

經過幾天折騰再折騰&#xff0c;弄出來了&#xff0c;弄出來了&#xff01;&#xff01;&#xff01; 消息展示 在位編輯功能。 兩個tiptap實例1個用來展示 消息列表&#xff0c;一個用來在位編輯消息。 tiptap靈活富文本編輯器&#xff0c;拓展性太好了!!! !!! 關鍵點&#x…

Ubuntu搭建Pytorch環境

Ubuntu搭建Pytorch環境 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 Ubuntu搭建Pytorch環境前言一、Anaconda二、Cuda1.安裝流程2、環境變量&#…

Sping Cloud配置和注冊中心

1.Nacos實現原理了解嗎&#xff1f; Nacos是注冊中心&#xff0c;主要是幫助我們管理服務列表。Nacos的實現原理大概可以從下面三個方面來講&#xff1a; 服務注冊與發現&#xff1a;當一個服務實例啟動時&#xff0c;它會向Nacos Server發送注冊請求&#xff0c;將自己的信息…

C++筆記之父類引用是否可以訪問到子類特有的屬性?

C++筆記之父類引用是否可以訪問到子類特有的屬性? code review! 參考筆記 1.C++筆記之在基類和派生類之間進行類型轉換的所有方法 文章目錄 C++筆記之父類引用是否可以訪問到子類特有的屬性?1.主要原因2.示例代碼3.說明4.如何訪問子類特有的屬性5.注意事項6.總結在 C++ 中,…

JavaScript逆向工程:如何判斷對稱加密與非對稱加密

在現代Web應用安全分析中&#xff0c;加密算法的識別是JavaScript逆向工程的關鍵環節。本文將詳細介紹如何在逆向工程中判斷JavaScript代碼使用的是對稱加密還是非對稱加密。 一、加密算法基礎概念 1. 對稱加密 (Symmetric Encryption) 特點&#xff1a;加密和解密使用相同的…

物理備份工具 BRM vs gs_probackup

什么是BRM 上一篇文章講了openGauss的物理備份工具gs_probackup&#xff0c;今天來說說BRM備份工具。 BRM備份恢復工具全稱為&#xff1a;Backup and Recovery Manager&#xff0c;是MogDB基于opengauss的備份工具 gs_probackup 做了一些封裝和優化,面向MogDB數據庫實現備份和…

問問lua怎么寫DeepSeek,,,,,

很坦白說&#xff0c;這十年&#xff0c;我幾乎沒辦法從互聯網找到這個這樣的代碼&#xff0c;互聯網引擎找不到&#xff0c;我也沒有很大的“追求”要傳承&#xff0c;或者要宣傳什么&#xff1b;直到DeepSeek的出現 兄弟&#xff0c;Deepseek現在已經比你更了解你樓下的超市…

react+Tesseract.js實現前端拍照獲取/選擇文件等文字識別OCR

需求背景 在開發過程中可能會存在用戶上傳一張圖片后下方需要自己識別出來文字數字等信息&#xff0c;有的時候會通過后端來識別后返回&#xff0c;但是也會存在純前端去識別的情況&#xff0c;這個時候就需要使用到Tesseract.js這個庫了 附Tesseract.js官方&#xff08;htt…