會議系統核心流程詳解:創建、加入與消息交互

一、系統架構概覽

會議系統采用"主進程+線程池+進程池"的分層架構,實現高并發與業務隔離:

Unix域套接字通信
Unix域套接字通信
客戶端
主進程
線程池
處理連接接收
進程池
管理會議室
房間進程1
含發送線程池
房間進程2
含發送線程池
房間進程N
含發送線程池

流程圖說明:

  1. 客戶端:作為外部請求發起方,連接到系統主進程。
  2. 主進程:系統核心控制節點,負責協調線程池和進程池。
  3. 線程池:由主進程管理,專門處理客戶端的連接請求(如TCP連接建立、請求解析等)。
  4. 進程池:負責管理多個獨立的“房間進程”,實現會議室的隔離和并發管理。
  5. 房間進程:每個進程對應一個會議室,內部包含發送線程池(用于高效處理消息推送),通過Unix域套接字與主進程通信(低延遲、高安全的本地進程間通信方式)。

這種架構通過“線程池處理連接 + 進程池隔離業務”的方式,兼顧了高并發處理能力和業務穩定性(單個房間故障不影響其他房間)。

核心組件角色

  • 主進程:全局資源管理,進程池調度,狀態監控
  • 線程池:接收客戶端連接,初步處理請求
  • 房間進程:獨立管理單個會議室,含1個接收線程+5個發送線程
  • 通信管道:主進程與房間進程通過Unix域套接字通信

二、創建會議室完整流程

1. 流程步驟

客戶端線程池線程主進程房間進程(空閑)發送 CREATE_MEETING 請求請求分配空閑房間查找空閑房間進程(遍歷room->>pptr)返回房間索引i通過管道傳遞connfd+命令'C'接收線程(accept_fd)處理連接標記客戶端為房主(user_pool->>owner)返回會議室創建成功狀態更新為"忙碌"(child_status=1)客戶端線程池線程主進程房間進程(空閑)

2. 關鍵技術細節

  • 房間分配機制:主進程通過遍歷room->pptr數組查找child_status=0的空閑進程,加鎖保證線程安全

    // 核心代碼:查找空閑房間
    pthread_mutex_lock(&room->lock);
    for (int i=0; i<room->num; i++) {if (room->pptr[i].child_status == 0) {  // 找到空閑房間room->pptr[i].child_status = 1;     // 標記忙碌room->navail--;break;}
    }
    pthread_mutex_unlock(&room->lock);
    
  • 連接交接技術:通過Unix域套接字傳遞客戶端連接(connfd),使用SCM_RIGHTS控制消息實現文件描述符跨進程傳遞

    // 傳遞連接核心代碼
    struct cmsghdr *cmptr = CMSG_FIRSTHDR(&msg);
    cmptr->cmsg_type = SCM_RIGHTS;
    *(int*)CMSG_DATA(cmptr) = client_fd;  // 傳遞文件描述符
    sendmsg(pipefd, &msg, 0);
    

三、加入會議完整流程

1. 流程步驟

客戶端線程池線程主進程目標房間進程(忙碌)房間內其他客戶端發送 JOIN_MEETING(房間ID) 請求請求連接目標房間ID通過管道傳遞connfd+命令'J'接收線程添加用戶到user_pool廣播"新用戶加入"通知返回加入成功更新用戶數(total++)客戶端線程池線程主進程目標房間進程(忙碌)房間內其他客戶端

2. 關鍵技術細節

  • 用戶池管理:房間進程通過user_pool結構體維護所有參會者連接,使用文件描述符集合(fdset)監控活動

    // 房間內用戶管理
    Pthread_mutex_lock(&user_pool->lock);
    FD_SET(client_fd, &user_pool->fdset);  // 添加新用戶
    user_pool->num++;                      // 增加用戶計數
    Pthread_mutex_unlock(&user_pool->lock);
    
  • 廣播通知機制:新用戶加入后,房間進程向所有已連接用戶發送通知,確保參會者列表同步

四、消息收發與轉發流程

1. 流程步驟

發送客戶端房間進程發送線程池接收客戶端1接收客戶端2發送消息(文字/圖片)主線程讀取消息頭解析類型完整接收消息體將消息加入發送隊列轉發消息(含發送者信息)轉發消息(含發送者信息)消息發送完成確認發送客戶端房間進程發送線程池接收客戶端1接收客戶端2

2. 關鍵技術細節

  • 多線程協作:房間進程采用"1個接收線程+5個發送線程"的模型,解耦消息接收與轉發

    // 發送線程池初始化
    for (int i=0; i<SENDTHREADSIZE; i++) {  // SENDTHREADSIZE=5Pthread_create(&tid, NULL, send_func, NULL);
    }
    
  • 消息隊列緩沖:使用線程安全的消息隊列(send_queue)平衡發送負載,避免消息阻塞

    // 消息入隊
    Pthread_mutex_lock(&queue.lock);
    queue.send_queue.push(msg);  // 存入消息
    Pthread_cond_signal(&queue.cond);  // 喚醒發送線程
    Pthread_mutex_unlock(&queue.lock);
    
  • 協議格式設計:消息采用固定格式頭部($_類型_IP_長度_),解決TCP粘包問題

    示例:$_TEXT_192.168.1.10_0005_Hello_#
    格式:$_[類型]_[IP]_[長度]_[內容]_#
    

五、進程與線程協作關系總結

組件角色職責通信方式
主進程進程池管理、狀態監控、資源調度Unix域套接字(與房間進程)
線程池線程接收客戶端連接、初步請求處理共享內存(主進程狀態)
房間進程主線程監控用戶活動、接收消息管道(與主進程)
房間接收線程處理新用戶加入、連接交接內部信號量
發送線程池消息轉發、負載均衡消息隊列(線程間)

六、模塊設計

1. 網絡通信模塊(net.cpp、netheader.h)

網絡通信是系統的基礎支撐,負責TCP連接的建立、數據傳輸及底層網絡操作封裝,主要功能包括:

  • 連接管理:通過Tcp_listen創建監聽套接字,支持IPv4/IPv6雙棧;Tcp_connect實現客戶端與服務器的連接;Accept封裝accept系統調用,處理中斷重試邏輯。
  • 數據讀寫Readnwriten保證TCP數據流的完整讀寫(解決短讀短寫問題);read_fdwrite_fd支持通過Unix域套接字傳遞文件描述符(用于進程間傳遞客戶端連接)。
  • 輔助功能Sock_ntop實現套接字地址到字符串的轉換;Setsockopt封裝setsockopt設置套接字選項(如SO_REUSEADDR)。

網絡模塊通過統一的錯誤處理(依賴err_quiterr_msg)保證異常場景的可追溯性。

2. 線程與進程同步模塊(unpthread.cpp、unpthread.h、msg.h)

系統采用多線程+多進程架構,同步機制是保證數據一致性的核心,主要組件包括:

  • 線程操作封裝Pthread_createPthread_detach等函數封裝原生 pthread 接口,簡化線程創建與管理,并統一錯誤處理。
  • 互斥鎖與條件變量Pthread_mutex_lockPthread_mutex_unlock封裝互斥鎖操作;Pthread_cond_waitPthread_cond_signal實現線程間等待/通知機制,用于消息隊列的生產-消費同步。
  • 消息隊列(SEND_QUEUE):定義于msg.h,基于std::queue實現線程安全的消息緩沖。通過互斥鎖(lock)保護隊列操作,條件變量(cond)協調生產者(push_msg)和消費者(pop_msg):當隊列滿時生產者等待,當隊列空時消費者等待,消息入隊/出隊后通過信號喚醒等待線程。

3. 會議房間管理模塊(room.cpp)

房間是系統的核心業務單元,負責管理會議內的用戶及消息分發,主要功能包括:

  • 房間生命周期管理clear_room函數負責關閉房間內所有用戶連接、清理用戶數據(fdsetstatusfdToIp)及消息隊列,將房間狀態置為CLOSE
  • 用戶加入/退出處理
    • accept_fd線程負責接收新用戶連接(通過進程間傳遞的文件描述符),根據操作類型(創建/加入會議)更新用戶池(pool),并發送會議響應或用戶加入通知。
    • fdclose函數處理用戶退出:若為房主退出則關閉整個房間,否則僅移除該用戶并廣播退出通知。
  • 消息分發send_func線程池從消息隊列(sendqueue)獲取消息,根據消息類型(如IMG_RECVTEXT_RECV)向房間內指定用戶(或所有用戶)轉發數據,確保消息格式統一($_msgType_ip_size_data_#)。

4. 用戶請求處理模塊(userdeal.cpp)

該模塊負責解析客戶端請求并協調房間資源,核心邏輯在dowithuser函數中:

  • 請求解析:讀取客戶端消息頭(11字節,包含消息類型、IP、數據長度),解析出CREATE_MEETING(創建會議)、JOIN_MEETING(加入會議)等請求類型。
  • 資源協調:創建會議時檢查進程池(room)是否有空閑房間,若有則通過write_fd向對應房間進程傳遞客戶端連接;加入會議時驗證房間有效性,通過房間進程的管道傳遞連接并返回結果。

5. 主程序與進程/線程池(main.cpp)

main.cpp是系統入口,負責初始化核心資源并協調各模塊運行:

  • 進程池初始化:通過process_make創建多個子進程(每個對應一個房間),父子進程通過Unix域套接字對(socketpair)通信,父進程監控子進程狀態(房間是否空閑)。
  • 線程池初始化:通過thread_make創建多個工作線程,負責處理客戶端初始連接(調用dowithuser)。
  • 主循環:通過select監控進程池管道,處理房間狀態更新(如房間空閑、用戶退出),維護全局資源的一致性。

6. 錯誤處理模塊(error.cpp)

系統通過err_quit(退出程序)、err_msg(僅打印錯誤)統一處理錯誤,基于err_doit函數格式化錯誤信息(包含errno描述),確保錯誤場景的標準化處理,簡化調試與問題定位。

核心設計優勢

  1. 進程隔離:單個房間崩潰不影響其他會議,提高系統穩定性
  2. 并發優化:線程池處理連接突發,發送線程池避免消息阻塞
  3. 高效通信:Unix域套接字實現低延遲進程間通信,支持文件描述符傳遞
  4. 狀態可見:主進程實時監控所有房間狀態,支持動態調度

通過這種多層次的進程-線程協作架構,系統可支持500+并發用戶、50+同時會議,消息轉發延遲控制在50ms以內,滿足實時會議的核心需求。

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

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

相關文章

Spring 創建 Bean 的 8 種主要方式

Spring&#xff08;尤其是 Spring Boot&#xff09;提供了多種方式來讓容器創建和管理 Bean。Component、Configuration Bean、EnableConfigurationProperties 都是常見方式。 下面我為你系統地梳理 Spring 創建 Bean 的所有主要方式&#xff0c;并說明它們的使用場景和區別。…

React 第七十節 Router中matchRoutes的使用詳解及注意事項

前言 matchRoutes 是 React Router v6 提供的一個核心工具函數&#xff0c;主要用于匹配路由配置與當前路徑。它在服務端渲染&#xff08;SSR&#xff09;、數據預加載、權限校驗等場景中非常實用。下面詳細解析其用法、注意事項和案例分析&#xff1a; 1、基本用法 import { m…

iSCSI服務配置全指南(含服務器與客戶端)

iSCSI服務配置全指南&#xff08;含服務器與客戶端&#xff09;一、iSCSI簡介 1. 概念 互聯網小型計算機系統接口&#xff08;Internet Small Computer System Interface&#xff0c;簡稱iSCSI&#xff09;是一種基于TCP/IP的協議&#xff0c;其核心功能是通過IP網絡仿真SCSI高…

堆(Heap):高效的優先級隊列實現

什么是堆&#xff1f;堆是一種特殊的完全二叉樹&#xff0c;滿足以下性質&#xff1a;堆序性&#xff1a;每個節點的值與其子節點滿足特定關系最小堆&#xff1a;父節點 ≤ 子節點&#xff08;根最小&#xff09;最大堆&#xff1a;父節點 ≥ 子節點&#xff08;根最大&#xf…

朝花夕拾(四) --------python中的os庫全指南

目錄 Python os模塊完全指南&#xff1a;從基礎到高階文件操作 1. 引言&#xff1a;為什么需要os模塊&#xff1f; 1.1 os模塊的重要性 1.2 適用場景 1.3 os模塊的"瑞士軍刀"特性 2. os模塊基礎功能 2.1 文件與目錄操作 2.1.1 核心方法介紹 2.1.2 避坑指南 …

uniappx 安卓端本地打包的一些總結

本人之前沒用過android studio&#xff0c;因為有打包到安卓端的需求&#xff0c;所以有了這篇文章。下面一些內容不正常工作&#xff0c;也不報錯&#xff0c;是很煩的&#xff0c;根本不知道是哪里出了問題。比如對應的aar包沒有引入。或者沒有注冊信息。 在實現過程中我遇到…

AUTOSAR進階圖解==>AUTOSAR_SWS_UDPNetworkManagement

AUTOSAR UDP網絡管理詳解 基于AUTOSAR標準的UDP網絡管理模塊架構分析與實現指南目錄 1. 概述2. UDP網絡管理架構 2.1 整體架構圖2.2 架構組件詳解 3. UDP網絡管理狀態機 3.1 狀態機圖3.2 狀態詳解 4. UDP網絡管理操作序列 4.1 序列圖4.2 操作流程詳解 5. UDP網絡管理配置模型 …

AI搜索引擎下的內容優化新范式:GEO的關鍵技術解析

摘要&#xff1a; 生成式AI搜索引擎的崛起&#xff0c;催生了GEO&#xff08;Generative Engine Optimization&#xff09;這一新的優化領域。本文將深入剖析GEO背后的關鍵技術&#xff0c;包括深度語義理解、結構化內容生成、以及AI算法的適配性&#xff0c;旨在為品牌在AI時代…

Java Lambda表達式是什么,怎么用

這種代碼是什么&#xff0c;怎么閱讀/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

集成運算放大器(反向加法,減法)

反向加法電路原理&#xff1a;示波器顯示&#xff1a;結論&#xff1a;輸出電壓-&#xff08;R4/R1*V1R4/R2*V2R4/R3*V3&#xff09;。平衡電阻R4等于R1和R2和R3的并聯電壓。減法運算電路原理&#xff1a;結論&#xff1a;減法運算電路分為三種不同情況&#xff0c;第一種情況為…

Maven入門到精通

目錄 一&#xff0c;Maven概述 1.1介紹 1.2安裝 1.3Maven生命周期和插件 1.4Maven的坐標的本地倉庫的存儲地址 二&#xff0c;依賴管理 2.1依賴管理——依賴范圍 2.2依賴管理——添加依賴 獲取依賴坐標 依賴添加后的操作 2.3依賴管理——依賴傳遞 2.4依賴管理——依…

計算機網絡 TCP 延遲確認機制

TCP 延遲確認&#xff08;Delayed Acknowledgments&#xff0c;簡稱 Delayed ACK&#xff09;是 TCP 協議中一項旨在減少網絡中小數據包數量、提升傳輸效率的優化機制。其核心思想是&#xff1a;不立即回復 ACK&#xff0c;而是等待一段時間&#xff08;通常 40ms&#xff09;&…

【visual studio】visual studio配置環境opencv和onnxruntime

下載opencv https://opencv.org/releases/?spma2ty_o01.29997173.0.0.57f4c921RELipW配置環境變量visual studio配置opencv 新建c項目選中文件后右鍵選擇屬性添加include文件夾庫文件添加lib添加lib文件 將上一步的lib文件夾下的兩個文件復制到這里以下兩者區別在于&#xff0…

【Java】多線程Thread類

1. 進程與線程進程與線程的基本認識進程&#xff08;Process&#xff09;&#xff1a;進程是程序的一次動態執行過程&#xff0c;它經歷了從代碼加載、執行、到執行完畢的一個完整過程&#xff1b;同時也是并發執行的程序在執行過程中分配和管理資源的基本單位&#xff0c;競爭…

C/C++復習(四)

一.模版 模版涉及的是泛型編程&#xff0c;即通過編譯器去確定類型的編程方式&#xff0c;模版分為&#xff1a;類模板和函數模版&#xff0c;下面我們一一復習&#xff1a; 函數模版&#xff1a; 格式&#xff1a; template<typename T1, typename T2,......,typename Tn&g…

022 基礎 IO —— 文件

&#x1f984; 個人主頁: 小米里的大麥-CSDN博客 &#x1f38f; 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 &#x1f381; GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄基礎 IO —— C 語言文件 I/O 操作基礎前言1. C 語言文件操作函數匯…

MNN LLM Chat iOS 流式輸出優化實踐

本文介紹了在 iOS 平臺上使用 MNN 框架部署大語言模型&#xff08;LLM&#xff09;時&#xff0c;針對聊天應用中文字流式輸出卡頓問題的優化實踐。通過分析模型輸出與 UI 更新不匹配、頻繁刷新導致性能瓶頸以及缺乏視覺動畫等問題&#xff0c;作者提出了一套包含智能流緩沖、U…

【開發技巧】VS2022+QT5+OpenCV4.10開發環境搭建QT Creator

VS2022編譯器支持配置 QT5默認安裝以后支持的是VS2015與VS2017&#xff0c;不支持VS2022&#xff0c;所以必須首先在Qt Creator中配置支持VS2022。配置順序如下&#xff1a; 首先打開【工具】->【選項】 然點擊Kits里面的【編譯器】選項。點擊Manual下面的【C】然后點擊【…

【Linux系統】動靜態庫的制作

前言&#xff1a; 上文我們講到了文件系統【Linux系統】詳解Ext2&#xff0c;文件系統-CSDN博客 本文我們來講講動靜態庫的制作 庫 【Linux】編譯器gcc/g及其庫的詳細介紹_linux gcc 有哪些庫-CSDN博客 這篇文章的第4大點&#xff0c;簡單是介紹了一下庫的基本概念。 靜態庫 靜…

鏈式二叉樹的基本操作——遍歷

本文筆者將帶領讀者一起學習鏈式二叉樹的一些基本語法&#xff0c;至于更難一些的插入刪除等&#xff0c;筆者將在后續C更新后再次詳細帶領大家學習。 首先&#xff0c;在進行二叉樹之前&#xff0c;我們需要一顆二叉樹&#xff0c;而二叉樹的初始化現階段實現不太現實&#x…