使用C++實現高效的套接字連接池

在現代網絡應用中,高效管理網絡連接是實現高并發和低延遲的重要因素。下面將詳細介紹如何使用C++實現一個高效的套接字連接池,以便在需要時快速復用連接,從而提高系統性能和資源利用率。

一、什么是連接池?

連接池是一種管理網絡連接的技術,允許在應用程序中預先創建和維護一定數量的連接,這些連接可以在需要時快速獲取和釋放。通過復用連接池中的連接,可以避免頻繁創建和銷毀連接帶來的開銷,提高應用程序的性能和響應速度。

二、連接池的基本設計

實現一個連接池需要考慮以下幾個方面:

  1. 連接的創建與銷毀:管理連接的生命周期。
  2. 連接的獲取與釋放:提供高效的接口以供應用程序獲取和釋放連接。
  3. 連接的有效性檢查:定期檢查連接的狀態,確保其可用性。

1. 連接池類的設計

我們將從設計一個簡單的連接池類開始,逐步擴展其功能。以下是連接池類的基本結構:

#include <iostream>
#include <vector>
#include <queue>
#include <memory>
#include <mutex>
#include <condition_variable>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>class SocketConnection {
public:SocketConnection(const std::string& ip, int port) : ip_(ip), port_(port), sock_fd_(-1) {connect();}~SocketConnection() {close(sock_fd_);}bool isValid() const {return sock_fd_ != -1;}int getFd() const {return sock_fd_;}private:std::string ip_;int port_;int sock_fd_;void connect() {sock_fd_ = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd_ < 0) {std::cerr << "Socket creation error" << std::endl;return;}struct sockaddr_in serv_addr;serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(port_);if (inet_pton(AF_INET, ip_.c_str(), &serv_addr.sin_addr) <= 0) {std::cerr << "Invalid address/ Address not supported" << std::endl;sock_fd_ = -1;return;}if (::connect(sock_fd_, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {std::cerr << "Connection failed" << std::endl;sock_fd_ = -1;}}
};class ConnectionPool {
public:ConnectionPool(const std::string& ip, int port, size_t poolSize) : ip_(ip), port_(port) {for (size_t i = 0; i < poolSize; ++i) {auto conn = std::make_shared<SocketConnection>(ip_, port_);if (conn->isValid()) {pool_.push(conn);}}}std::shared_ptr<SocketConnection> getConnection() {std::unique_lock<std::mutex> lock(mutex_);while (pool_.empty()) {cv_.wait(lock);}auto conn = pool_.front();pool_.pop();return conn;}void releaseConnection(std::shared_ptr<SocketConnection> conn) {std::unique_lock<std::mutex> lock(mutex_);pool_.push(conn);cv_.notify_one();}private:std::string ip_;int port_;std::queue<std::shared_ptr<SocketConnection>> pool_;std::mutex mutex_;std::condition_variable cv_;
};

2. 使用連接池

下面是一個簡單的使用示例,演示如何獲取和釋放連接:

int main() {ConnectionPool pool("127.0.0.1", 8080, 10);auto conn = pool.getConnection();if (conn->isValid()) {// 使用連接進行數據傳輸std::cout << "Connected to server with fd: " << conn->getFd() << std::endl;}pool.releaseConnection(conn);return 0;
}

三、優化和擴展

1. 動態擴展連接池

為避免連接池在高峰期無法滿足需求,我們可以增加動態擴展的功能。

std::shared_ptr<SocketConnection> ConnectionPool::getConnection() {std::unique_lock<std::mutex> lock(mutex_);if (pool_.empty()) {auto conn = std::make_shared<SocketConnection>(ip_, port_);if (conn->isValid()) {return conn;}} else {auto conn = pool_.front();pool_.pop();return conn;}cv_.wait(lock);return nullptr;
}

2. 連接的有效性檢查

我們可以使用心跳機制或者定期檢查連接的方式來確保連接的有效性。

void ConnectionPool::releaseConnection(std::shared_ptr<SocketConnection> conn) {std::unique_lock<std::mutex> lock(mutex_);if (conn->isValid()) {pool_.push(conn);} else {auto newConn = std::make_shared<SocketConnection>(ip_, port_);if (newConn->isValid()) {pool_.push(newConn);}}cv_.notify_one();
}

3. 多線程支持

為了在多線程環境下使用,我們在獲取和釋放連接時使用了互斥鎖和條件變量,確保線程安全。

四、總結

本文介紹了如何在C++中實現一個高效的套接字連接池,包括基本設計、使用示例以及優化和擴展。通過使用連接池,能夠顯著提升網絡應用的性能和資源利用率。

通過這種方式,你可以創建一個高效且靈活的連接池,為你的網絡應用提供穩定的性能支持。

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

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

相關文章

RFID防盜門:守護您的商品資產安全!

在新零售運營管理中&#xff0c;防盜是至關重要的一環。根據美國零售聯合會發布的年度零售安全調查&#xff0c;2022年美國零售商損失了創紀錄的1121億美元。其中年度損失最大因素是由外部盜竊導致庫存損失和員工內部盜竊造成的。 然而傳統零售業商品資產盤點往往依賴人工排查&…

ConcurrentHashMap詳解 什么時候CAS什么時候synchronized

jdk:1.7 segment數組hashEntry數組鏈表實現 jdk版本&#xff1a;1.8&#xff1a;hashEntry數組紅黑樹實現 1、基本參數 //**1、最大容量** hashmap的最大容量也是這個&#xff0c;菜鳥一面被問到了 private static final int MAXIMUM_CAPACITY 1 << 30;//數組默認為…

《科技與健康》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

問題解答 問&#xff1a;《科技與健康》期刊萬方網可查嗎 答&#xff1a;萬方、維普可查 問&#xff1a;《科技與健康》是正規期刊嗎&#xff1f; 答&#xff1a;萬方維普收錄的正規期刊。主管單位&#xff1a;長江出版傳媒股份有限公司 主辦單位&#xff1a;湖北科學技術…

孩子出生后為什么要做聽力篩查?

孩子出生后為什么要做聽力篩查&#xff1f; 新生兒聽力篩查&#xff0c;就是對所有新生兒在盡早的時間&#xff08;出生48小時后&#xff09;進行系統的聽力篩查測試。據相關文獻報道&#xff0c;在我國&#xff0c;正常分娩的新生兒聽力障礙的發生率約為0.1&#xff5e;0.3%&a…

機場專用手持激光驅鳥器原理及優勢

在機場的驅鳥工作中&#xff0c;各類驅鳥設備共同構建起一道堅不可摧的防線&#xff0c;以保障航班的安全起降。其中激光驅鳥器以其卓越的性能和顯著效果&#xff0c;在機場鳥擊防治中發揮著至關重要的作用。 激光驅鳥器&#xff0c;分為大型自動式和小型手持式&#xff0c;其有…

Python 技能提升(二)

理想的類結構 Property裝飾器 # 傳統寫法 class Square1:def __init__(self):self.__side Nonedef get_side(self):return self.__sidedef set_side(self, side):assert side > 0, 邊長不能為負數&#xff01;self.__side sidedef del_side(self):# del self.__sideself.…

「前端+鴻蒙」核心技術HTML5+CSS3(十)

1、H5簡介 H5是HTML5的簡稱,是構建現代網站和網絡應用的標準標記語言。HTML5新增了許多功能,包括更好的多媒體支持、新的表單控件、繪圖功能以及對響應式設計的改進。 2、H5產品布局 移動端H5網站布局通常使用流體布局或彈性盒模型(Flexbox),以適應不同屏幕尺寸。 示例…

2024年有什么值得入手的5G長期套餐大流量卡推薦?大流量手機卡入手指南(超4款正規手機卡實測總結)

前言 24年有什么值得入手的5G大流量卡推薦&#xff1f;大流量手機卡入手指南&#xff08;超4款正規手機卡實測總結&#xff09; 四大運營商有哪些大流量卡&#xff0c;可電話&#xff0c;非物聯網卡 所有卡激活后&#xff0c;均可以在官方app可查、 所有都是優惠長期 5G大流…

Python-匿名函數

一、概念 匿名函數造出來的是一個內存地址&#xff0c;且內存地址沒有綁定任何名字&#xff0c;很快被當做垃圾清理掉。所以匿名函數只需要臨時調用一次&#xff0c;而有名函數永久使用&#xff1b; 匿名函數一般和其他函數配合使用&#xff1b; # 有名函數def func(x, y):…

抖音直播統計、直播間無人互動直播效果軟件--抖音大師!

抖音大師介紹 抖音大師是抖音直播統計、直播間無人互動直播效果軟件&#xff0c;通過它&#xff0c;你可以快速添加直播互動效果&#xff01;軟件使用C#開發&#xff0c;無論是內存占用還是執行效果都遠比同行的效果高太多&#xff01;&#xff01;電腦所需性能大大降低&#x…

內聯匯編簡介

在C語言中嵌入匯編&#xff08;Assembly&#xff09;代碼&#xff0c;可以使用內聯匯編&#xff08;Inline Assembly&#xff09;&#xff0c;這在一些需要精確控制硬件或者優化性能的場合非常有用 以下是關于ASM語法的介紹&#xff0c;主要基于GCC&#xff08;GNU Compiler C…

做軟件測試需要懂代碼嗎?

隨著大數據、機器學習時代的到來&#xff0c;不少人有了“測試不需要懂代碼&#xff0c;那我就試試”的想法。這就引發了一系列疑問&#xff1a;不懂代碼可以做測試嗎&#xff1f;測試人員到底需不需要懂代碼&#xff1f;測試人員需要寫代碼嗎&#xff1f; 其實&#xff0c;在…

精準檢測,可燃氣體報警系統的技術原理與特點

在現代化的工業生產與日常生活中&#xff0c;可燃氣體泄露事故頻發&#xff0c;給人們的生命和財產安全帶來了嚴重威脅。 因此&#xff0c;可燃氣體報警檢測系統的應用變得尤為重要。它不僅能夠實時監測環境中的可燃氣體濃度&#xff0c;還能在發現異常情況時及時報警&#xf…

記 Codes 開源免費研發管理平臺 —— 生成式全局看板的創新實現

繼上一回合瀑布與敏捷的融合創新實現后&#xff0c;本篇我們來講一講 Codes 生成式全局看板的創新實現。 市面上所有的研發管理軟件&#xff0c;看板模式的項目&#xff0c;都是物理看板的電子化&#xff0c;好像也沒什么問題&#xff0c;但是在使用過程中體驗非常不好&#xf…

WebSocket和HTTP協議對比

WebSocket和HTTP是兩種不同的通信協議&#xff0c;它們在多個方面存在顯著差異&#xff0c;主要區別包括&#xff1a; 通信模式&#xff1a; HTTP 是一種無狀態的、基于請求-響應模型的協議。這意味著通信總是由客戶端發起請求&#xff0c;服務器被動響應。每次請求和響應都是獨…

使用 zxing 生成二維碼以及條形碼

需求背景 前期在做項目的時候&#xff0c;有一個需求是說要生成一張條形碼&#xff0c;并且呢將條形碼插入到 excel 中去&#xff0c;但是之前一直沒有搞過找個條形碼或者是二維碼&#xff0c;最后是做出來了&#xff0c;這里呢就先看看怎么生成&#xff0c;后面再抽時間來寫寫…

一條SQL語句的執行究竟經歷了哪些過程

在數據庫管理系統(DBMS)中,一條SQL語句的執行過程復雜且精細,從用戶輸入到獲取結果,中間需要經過多個步驟和組件的協同工作。這些步驟包括解析、優化、執行和結果返回等。以下是SQL語句執行過程的詳細分析: 1. 客戶端連接 連接建立: 用戶通過客戶端(如應用程序、SQL客戶…

掌握Element UI:加速你的網頁設計過程!

Element UI 是一套為開發者、UI/UX設計師和產品經理準備的采用Vue 2.0作為基礎框架實現的組件庫&#xff0c;提供配套的設計資源&#xff0c;可以幫助設計快速成型。即時設計也內置Element UI Kit資源&#xff0c;但有些小伙伴還是對此不太了解&#xff0c;接下來本文會詳細帶你…

antd-vue - - - - - a-select結合i18n使用(踩坑問題)

antd-vue - - - - - a-select結合i18n使用&#xff08;踩坑問題&#xff09; 1. 當前代碼 & 效果2. 解決辦法 1. 當前代碼 & 效果 <a-selectv-model:value"formState.quickSwitching":options"quickSwitchingOptions"search"handleSearch…

vue3+element-plus 表單校驗和循環form表單校驗

1.HTML頁面 //el-form 標簽添加上 ref"form2Form" :rules"rules2" :model"form2" 正常表單校驗 //沒有循環表單的使用事例<el-form-item label"投保人名稱" class"insurance-date-no1" prop"tbrName">…