【Linux網絡】TCP服務中IOService應用與實現

📢博客主頁:https://blog.csdn.net/2301_779549673
📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
📢本文由 JohnKi 原創,首發于 CSDN🙉
📢未來很長,值得我們全力奔赴更美好的生活?

在這里插入圖片描述

在這里插入圖片描述

文章目錄

  • 🏳??🌈一、TcpService.hpp
    • 1.1 TcpService類
    • 1.2 構造、析構函數
    • 1.3 Loop() 循環函數
  • 🏳??🌈二、Service.hpp
    • 2.1、IOService類基本結構
    • 2.2 構造函數、析構函數
    • 2.3 IOSExcute()
  • 🏳??🌈三、TcpServer.cpp
  • 👥總結


上一篇文章簡單的將 Socket 類進行了封裝,封裝的目的是為了我們后序直接使用的,因此這篇文章使用封裝好的Socket類實現網絡計算器(加協議版本)的一部分輪廓,此處我們將執行方法單獨放在一個文件!

🏳??🌈一、TcpService.hpp

我們這里使用 TcpServer 的多線程版本,如有其他版本的需要,可移步 傳送門

1.1 TcpService類

TcpServer類成員變量端口號,監聽套接字(封裝的智能指針類型),運行狀態和執行方法構造函數初始化成員變量即可!

namespace TcpServerModule{using namespace SocketModule;using namespace LogModule;using service_t = std::function<void(SocketModule::SockPtr, InetAddr&)>;class TcpServer{public:TcpServer(service_t service, uint16_t port){}void Loop(){}~TcpServer(){}private:uint16_t port;SockPtr _listensock;bool _isrunning;service_t _service;};
}

1.2 構造、析構函數

構造函數初始化成員變量并創建監聽套接字(調用父類方法),析構函數無需處理!

TcpServer(service_t service, uint16_t port): _port(port), _listensock(std::make_shared<TcpSocket>()),_isrunning(false), _service(service) {_listensock->BuildListenSocket(port);
}
~TcpServer() {}

1.3 Loop() 循環函數

Loop()函數使用多線程的版本執行長服務,讓新線程去執行主函數傳遞的執行方法!

void Loop() {_isrunning = true;while (_isrunning) {InetAddr client;// 獲取客戶端連接SockPtr cli = _listensock->Accepter(&client);if (cli == nullptr)continue;LOG(LogLevel::DEBUG)<< "get a new connection from " << client.AddrStr().c_str();// 獲取成功pthread_t tid;// ThreadData 的頭文件是ThreadData* td = new ThreadData(cli, this, client);pthread_create(&tid, nullptr, Execute, td); // 新線程分離}
}
// 線程函數參數對象
class ThreadData {
public:SockPtr _sockfd;TcpServer* _self;InetAddr _addr;public:ThreadData(SockPtr sockfd, TcpServer* self, const InetAddr& addr): _sockfd(sockfd), _self(self), _addr(addr) {}
};
// 線程函數
static void* Execute(void* args) {ThreadData* td = static_cast<ThreadData*>(args);// 子線程結束后由系統自動回收資源,無需主線程調用 pthread_joinpthread_detach(pthread_self()); // 分離新線程,無需主線程回收td->_self->_service(td->_sockfd, td->_addr);delete td;return nullptr;
}

🏳??🌈二、Service.hpp

該文件設計一個類,其中一個成員函數實現執行方法暫時先讓服務端代碼編譯過即可,后序再加協議!

2.1、IOService類基本結構

class IOService{public:IOService();void IOExcute(SockPtr sock, InetAddr& addr);~IOService();
};

2.2 構造函數、析構函數

這個類沒有成員變量,所以這兩部分不需要處理

2.3 IOSExcute()

該函數時 TcpServer 中執行方法的具體實現,此處暫時只進行IO操作,保證編譯通過

void IOExcute(SockPtr sock, InetAddr& addr) {while (true) {std::string message;// ssize_t Recv(std::string* out) override{}ssize_t n = sock->Recv(&message);if (n > 0) {LOG(LogLevel::INFO) << "get message: " << message << "from"<< addr.AddrStr().c_str();std::string rsp = "response test";sock->Send(rsp);} else if (n == 0) {LOG(LogLevel::INFO)<< "client " << addr.AddrStr().c_str() << " disconnected";break;} else {LOG(LogLevel::ERROR)<< "recv error for client: " << addr.AddrStr().c_str();break;}}
}

🏳??🌈三、TcpServer.cpp

創建TcpServer類對象,并調用執行函數運行服務端!

#include "TcpServer.hpp"
#include "Service.hpp"using namespace TcpServerModule;int main(int argc, char* argv[]){if(argc != 2){std::cerr << "Usage: " << argv[0] << " port" << std::endl;Die(1);}uint16_t port = std::stoi(argv[1]);IOService service;std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(std::bind(&IOService::IOExcute, &service, std::placeholders::_1, std::placeholders::_2),port);tsvr->Loop();return 0;
}

👥總結

本篇博文對 【Linux網絡】TCP服務中IOService應用與實現 做了一個較為詳細的介紹,不知道對你有沒有幫助呢

覺得博主寫得還不錯的三連支持下吧!會繼續努力的~

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

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

相關文章

Linux 怎么找Java程序的監聽的端口

Linux 怎么找Java程序的監聽的端口 1、假設你知道啟動該Java應用的進程ID (PID)&#xff0c;可以通過以下命令查找其監聽的端口&#xff1a; 首先找到該Java應用的PID&#xff1a; ps -ef | grep xxxx-1.0-RELEASE.jar或者&#xff0c;如果你知道啟動命令的一部分&#xff0…

解讀《數據資產質量評估實施規則》:企業數據資產認證落地的關鍵指南

隨著“數據要素市場”建設加速&#xff0c;數據資產逐步成為企業核心資產之一。2024年4月&#xff0c;由中國質量認證中心&#xff08;CQC&#xff09;發布的《數據資產質量評估實施規則》&#xff08;編號&#xff1a;CQC96-831160-2024&#xff09;正式實施&#xff0c;為企業…

[吾愛出品] 【鍵鼠自動化工具】支持識別窗口、識圖、發送文本、按鍵組合等

鍵鼠自動化工具 鏈接&#xff1a;https://pan.xunlei.com/s/VOOhDZkj-E0mdDZCvo3jp6s4A1?pwdfufb# 1、增加的找圖點擊功能&#xff08;不算增加&#xff0c;只能算縫補&#xff09;&#xff0c;各種的不完善&#xff0c;但是能運行。 2、因為受限于原程序的界面&#xff0c;…

【計算機視覺】CV實戰項目 - 基于YOLOv5的人臉檢測與關鍵點定位系統深度解析

基于YOLOv5的人臉檢測與關鍵點定位系統深度解析 1. 技術背景與項目意義傳統方案的局限性YOLOv5多任務方案的優勢 2. 核心算法原理網絡架構改進關鍵點回歸分支損失函數設計 3. 實戰指南&#xff1a;從環境搭建到模型應用環境配置數據準備數據格式要求數據目錄結構 模型訓練配置文…

IntelliJ IDEA 中配置 Spring MVC 環境的詳細步驟

以下是在 IntelliJ IDEA 中配置 Spring MVC 環境的詳細步驟&#xff1a; 步驟 1&#xff1a;創建 Maven Web 項目 新建項目 File -> New -> Project → 選擇 Maven → 勾選 Create from archetype → 選擇 maven-archetype-webapp。輸入 GroupId&#xff08;如 com.examp…

基于javaweb的SpringBoot+MyBatis通訊錄管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

EFISH-SBC-RK3588無人機地面基準站項目

一、核心技術組件解析 1. EFISH-SBC-RK3588 性能優勢&#xff1a;作為瑞芯微推出的高性能處理器&#xff0c;采用8nm 工藝&#xff0c;搭載ARM Cortex-A76/A55 八核架構&#xff0c;集成強大的 NPU&#xff08;神經網絡處理單元&#xff09;和 GPU&#xff08;圖形處理器&…

藍橋杯 4. 卡片換位

卡片換位 原題目鏈接 題目描述 你玩過華容道的游戲嗎&#xff1f; 這是一個類似的&#xff0c;但更簡單的游戲。 看下面的 3 2 格子&#xff1a; --------- | A | * | * | --------- | B | | * | ---------在其中放置了 5 張牌&#xff0c;其中&#xff1a; A 表示關…

7.Excel:單元格格式

一 案例 1.案例1 2.案例2 3.案例3 二 三種基本數據類型 補充&#xff1a;在沒有任何格式的情況下是這樣對齊的。 1.文本 默認左對齊&#xff0c;文本不可參與計算。 2.數值 默認右對齊&#xff0c;數值計算精度是15位。 若超出15位&#xff0c;超出部分顯示為0。 3.邏輯值 …

高效DCDC電源芯片在運動控制器中的應用:設計考量、性能評估與可靠性分析

摘要 隨著工業自動化的深入推進&#xff0c;運動控制器作為自動化系統的核心組件&#xff0c;對電源芯片的性能提出了極高要求。高效率DCDC電源芯片憑借其卓越的電能轉換效率、優異的負載響應特性和高功率密度&#xff0c;在運動控制器領域得以廣泛應用。本文以國科安芯的ASP3…

Action:Update your application‘s configuration

在使用Maven項目時&#xff0c;有一個報錯信息是&#xff1a;Update your applications configuration 這類問題&#xff0c;就是我們的application.yml文件 或者 application.properties文件 內容哪里寫錯了 最有可能就是對齊方式有問題

Pycharm(六):可變與不可變類型

一、引用 在java中既有值傳遞,也有引用傳遞,我們思考一下在python中值的傳遞方式是哪種類型呢? 答案是引用傳遞。 概述: Python中存儲變量是需要占用內存空間的,為了更好地管理這些空間,每塊空間都是有自己的地址值的。 格式: id(變量名/值) 可以查看變量/…

動態ip與靜態ip的概念、區別、應用場景

動態ip與靜態ip的區別 前言 一、IP地址的概念和作用 1.1、IP地址的定義 1.2、IP地址的作用 二、動態IP和靜態IP的區別 2.1、動態IP和靜態IP的定義 2.2、動態IP和靜態IP的特點 2.3、動態IP和靜態IP的優缺點比較 三、動態IP和靜態IP的應用場景 3.1. 動態IP的應用場景 3.2. 靜態IP…

六個能夠白嫖學習資料的網站

一、咖喱君的資源庫 地址&#xff1a;https://flowus.cn/galijun/share/de0f6d2f-df17-4075-86ed-ebead0394a77 這是一個學習資料/學習網站分享平臺&#xff0c;包含了英語、法語、德語、韓語、日語、泰語等幾十種外國語言的學習資料及平臺&#xff0c;這個網站的優勢就是外語…

[貪心_7] 最優除法 | 跳躍游戲 II | 加油站

目錄 1.最優除法 題解 2.跳躍游戲 II 題解 3.加油站 題解 利用 單調性&#xff0c;可以實現 區間跳躍 1.最優除法 鏈接&#xff1a; 553. 最優除法 給定一正整數數組 nums&#xff0c;nums 中的相鄰整數將進行浮點除法。 例如&#xff0c;nums [2,3,4]&#xff0c;我…

“Daz to Unreal”將 G8 角色(包括表情)從 daz3d 導入到 UE5。在 UE5 中,我發現使用某個表情并與閉眼混合后,上眼瞼出現了問題

1) Bake & Export Corrective Morphs from Daz before you go into UE5 1) 在進入 UE5 之前&#xff0c;從 Daz 烘焙并導出修正型變形 In Daz Studio 在 Daz Studio 中 Load your G8 head, dial in the exact mix (e.g. Smile 1.0 Eyes Closed 1.0). 加載你的 G8 頭部&am…

【機器學習速記】面試重點/期末考試

自用,有錯誤歡迎評論區指出 目錄 一、機器學習基礎概念 二、機器學習類型分類 三、經典算法與原理 1. 線性模型 2. 決策樹 3. SVM(支持向量機) 4. K近鄰(KNN) 5. 貝葉斯分類 6. 集成學習 四、模型評價指標 五、模型泛化能力與調參 六、特征工程與數據預處理 七、維…

Redis 原子操作

文章目錄 前言? 一、什么是「原子操作」&#xff1f;&#x1f50d; 二、怎么判斷一個操作是否原子&#xff1f;&#x1f9ea; 三、項目中的原子 vs 非原子案例&#xff08;秒殺系統&#xff09;? 原子性&#xff08;OK&#xff09;? 非原子性&#xff08;高風險&#xff09;…

中建海龍MiC模塊化建筑賦能“好房子”新范式

中國建筑國際集團旗下中建海龍科技有限公司&#xff08;以下簡稱“中建海龍”&#xff09;以科技創新為引擎&#xff0c;持續推動建筑行業向工業化、數字化、綠色化轉型升級。近期&#xff0c;其自主研發的模塊化集成建筑&#xff08;MiC&#xff09;技術成功入選中國建筑首批產…

DDL自聯表

自聯表 create table t_menu (id int AUTO_INCREMENT,name varchar(20),image varchar(20),url varchar(20),pid varchar(20),constraint pk_id primary key(id),constraint fk_id foreign key(pid) references t_menu(id) );