最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

cpp-httplib和websocketpp哪個好,C++如何實現(xiàn)WebSocket實時通信?

 更新時間:2026年07月11日 12:04:26   作者:羑悻的小殺馬特.  
想用C++開發(fā)HTTP或WebSocket應(yīng)用?本文深入淺出地介紹cpp-httplib和websocketpp兩大實用庫,cpp-httplib單文件集成,輕松搭建HTTP客戶端和服務(wù)端;websocketpp則助你實現(xiàn)全雙工實時通信,告別輪詢,無論你是做API調(diào)用、微服務(wù),還是游戲、物聯(lián)網(wǎng)實時推送,都能從中獲得幫助

本文介紹 cpp - httplib 和 websocketpp 兩個 C++ 庫。前者輕量易用,支持 HTTP/HTTPS 客戶端和服務(wù)端,適用于多種場景;后者遵循 RFC 6455,實現(xiàn) WebSocket 全雙工通信,幫助實現(xiàn)實時應(yīng)用開發(fā)。

一.cpp-httplib介紹及使用

介紹

1. 基本定義
  • 輕量級 C++ HTTP 庫,僅單個頭文件(httplib.h),無需復(fù)雜依賴。
  • 支持 HTTP/HTTPS 協(xié)議,同時提供 客戶端和服務(wù)端 功能。
2. 核心特點
  • 單文件集成:只需包含 httplib.h 即可使用,無額外庫依賴。
  • 跨平臺兼容:支持 Windows、Linux、macOS 等主流操作系統(tǒng)。
  • 簡單易用:API 設(shè)計直觀,代碼簡潔,易于集成與使用。
  • 高性能:基于高效 I/O 模型,適用于高并發(fā)網(wǎng)絡(luò)通信場景。
  • 功能全面:支持多種 HTTP 方法(GET、POST 等)、Header 管理、Cookie、文件上傳、HTTPS 加密等。
3. 主要功能
  • 客戶端功能
    • 發(fā)送各類 HTTP 請求(GET、POST、PUT、DELETE 等)。
    • 支持設(shè)置請求頭、Body 數(shù)據(jù)、超時控制等。
    • 處理響應(yīng)數(shù)據(jù),包括狀態(tài)碼、響應(yīng)頭和 Body 內(nèi)容。
  • 服務(wù)端功能
    • 快速搭建 HTTP 服務(wù),監(jiān)聽指定端口。
    • 處理不同路由的請求,支持自定義響應(yīng)邏輯。
    • 支持多線程、異步處理,提升并發(fā)性能
4. 適用場景
  • 客戶端應(yīng)用:調(diào)用 RESTful API、爬蟲程序、自動化腳本、HTTP 客戶端工具等。
  • 服務(wù)端開發(fā):快速構(gòu)建輕量級 Web 服務(wù)、API 接口、微服務(wù)、測試服務(wù)器等。
  • 嵌入式系統(tǒng):適用于資源受限環(huán)境下的 HTTP 通信需求。
5. 優(yōu)勢總結(jié)
  • 輕量化:單文件設(shè)計,易于集成與維護。
  • 高效性:高性能網(wǎng)絡(luò)通信,適合高并發(fā)應(yīng)用。
  • 靈活性:豐富的功能支持,滿足多種 HTTP 通信需求。
  • 易用性:簡潔的 API 設(shè)計,降低開發(fā)門檻,提升開發(fā)效率。

簡單來說: httplib憑借它的輕量化與簡單易用根據(jù)標簽調(diào)用對應(yīng)回調(diào)函數(shù)完成處理)并且能夠及時更新對應(yīng)功能的特點值得點贊,C++ 開發(fā)者需要在項目中實現(xiàn) HTTP 通信時,cpp-httplib 是一個理想的選擇。

簡單回調(diào)機制

通過 路由標簽(如 /api 綁定 回調(diào)函數(shù),當請求匹配標簽時自動觸發(fā)對應(yīng)處理邏輯 。

服務(wù)端 使用 Server 類的 .Get()/.Post() 等方法注冊標簽和回調(diào):

 svr.Get("/user", const Request&, Response& { /* 處理邏輯 */ });

標簽即路由路徑(如 /login),回調(diào)函數(shù)接收請求和響應(yīng)對象 。

特點:

  • 精準匹配:按路徑標簽分發(fā)請求
  • 靈活處理:回調(diào)內(nèi)可自定義狀態(tài)碼、響應(yīng)頭、Body內(nèi)容
  • 輕量級:無復(fù)雜路由框架,直接通過標簽綁定邏輯

如圖所示:

本質(zhì): 用字符串標簽(路由)作為鍵,回調(diào)函數(shù)作為值 的簡易路由表機制。

安裝教程

這里可以直接git clone即可:

https://github.com/yhirose/cpp-httplib

下載后可以看到對應(yīng)里面內(nèi)容:

  • 這里我們只需要用到對應(yīng)頭文件httplib.h就夠了。

簡單操作

效果展示:

  • httplib服務(wù)端成功啟動。

  • 訪問對應(yīng)路徑就能收到對應(yīng)答復(fù)。

簡單機制:

其實這里就是客戶訪問的時候發(fā)對象請求發(fā)給對應(yīng)httplib,然后它提取內(nèi)部的路徑解析出來,拿著回調(diào)函數(shù)表去匹配,最后執(zhí)行完拿到對應(yīng)response進行組織發(fā)送回去。

測試代碼:

#include "../../common/httplib.h"

int main()
{
    // 1. 實例化服務(wù)器對象
    httplib::Server server;
    // 2. 注冊回調(diào)函數(shù)   void(const httplib::Request &, httplib::Response &)
    server.Get("/httplib", [](const httplib::Request &req, httplib::Response &rsp){
        std::cout << req.method << std::endl;
        std::cout << req.path << std::endl;   
        std::cout << req.matched_route << std::endl;
        for (auto it : req.headers) {
            std::cout << it.first << ": " << it.second << std::endl;
        }
        std::string body = "httplib-test";
        rsp.set_content(body, "text/html");
        rsp.status = 200;
    });
    //server.Post() //這里其實就是對應(yīng)發(fā)來的request里面有對應(yīng)body;進行提取解析后再由服務(wù)器進行答復(fù)即可
    // 3. 啟動服務(wù)器
    server.listen("0.0.0.0", 8081);
    return 0;
}

二.Websocket/Websocketpp介紹與使用

背景引入

比如使用httplib的時候是一問一答(客戶端請求,服務(wù)端給出回答),但是服務(wù)端不能像客戶端端主動推送;如果只是使用原生的 HTTP 協(xié)議,要想實現(xiàn)消
息推送一般需要通過 “輪詢” 的方式實現(xiàn), 而輪詢的成本比較高并且也不能及時的獲取到消息的響應(yīng);因此websocket就誕生了(允許客戶端與服務(wù)端之間建立長連接,然后完成服務(wù)端的主動推送)。

websocket簡單原理

WebSocket協(xié)議的本質(zhì)是一個基于TCP的協(xié)議; 客戶端瀏覽器首先向服務(wù)器發(fā)起一個HTTP請求;與通常的HTTP請求不同,包含一些附加頭信息;通過這些附加頭信息來完成握手過程以及協(xié)議升級過程

對應(yīng)操作圖:

協(xié)議升級報文交互格式:

報文格式:

下面解析下:

1. 控制標志位(Control Flags)

字段位數(shù)說明
FIN1 bit最終幀標記
1 = 當前幀是消息的最后一幀;
0 = 消息未結(jié)束,后續(xù)還有幀(支持分片傳輸)。
RSV1、RSV2、RSV3各 1 bit保留位
默認值為 0,若協(xié)議擴展(如壓縮)啟用時可能被使用,否則必須為 0。

2. 操作碼(Opcode)

字段位數(shù)說明
4 位 Opcode4 bits定義幀類型
常見值:

- 0x0(繼續(xù)幀)
- 0x1(文本數(shù)據(jù))
- 0x2(二進制數(shù)據(jù))
- 0x8(關(guān)閉連接)
- 0x9(Ping,心跳檢測)
- 0xA(Pong,響應(yīng) Ping)

3. 掩碼(Mask)

字段位數(shù)說明
MASK1 bit是否掩碼
1 = Payload 數(shù)據(jù)經(jīng)過掩碼處理(客戶端發(fā)送到服務(wù)器時必須為 1,服務(wù)器返回時必須為 0)。

4. Payload 長度(Payload Length)

字段位數(shù)說明
7 位 Payload 長度7 bits基礎(chǔ)長度
表示 Payload 長度 ≤ 125。

若長度 > 125,則需擴展字段:
- 16 位 Payload 長度(長度 ≤ 65535)
- 32 位 Payload 長度(長度 > 65535,超大消息)

5. 掩碼密鑰(Mask-Key)

字段位數(shù)說明
Mask-Key0 或 4 字節(jié)僅當 MASK=1 時存在
客戶端發(fā)送時,隨機生成 4 字節(jié)密鑰,用于對 Payload 數(shù)據(jù)進行異或掩碼處理。
服務(wù)器解碼時需用相同密鑰還原數(shù)據(jù)。

6. Payload 數(shù)據(jù)(Payload Data)

字段說明
Payload 數(shù)據(jù)實際傳輸?shù)南?nèi)容,長度由 Payload Length 決定,類型由 Opcode 定義(文本、二進制等)。

關(guān)鍵規(guī)則總結(jié)

  1. 客戶端必須對出站消息加掩碼(MASK=1),服務(wù)器必須驗證并解碼。
  2. 服務(wù)器不得對出站消息加掩碼(MASK=0),否則客戶端會拒絕連接。
  3. Opcode 決定數(shù)據(jù)處理方式(如文本、二進制、關(guān)閉連接等)。
  4. 分片傳輸:通過 FIN=0 和 Opcode=0(繼續(xù)幀)實現(xiàn)大消息拆分。
  5. 控制幀(如 Ping/Pong/Close)通常不掩碼,且長度較?。?le;125字節(jié))。

也正是通過以上字段的組合,WebSocket 實現(xiàn)了高效、靈活的全雙工通信。

websocketpp介紹

WebSocketpp 是 C++ 語言的 WebSocket 協(xié)議庫,嚴格遵循 RFC 6455 標準,支持構(gòu)建客戶端/服務(wù)器,實現(xiàn)全雙工實時通信。它提供文本/二進制數(shù)據(jù)傳輸、握手升級、連接管理等核心功能,基于 Boost.Asio(可無 Boost 配置),采用事件驅(qū)動回調(diào)機制,支持 Ping/Pong 心跳和 SSL/TLS 加密(wss://)。適用于游戲、物聯(lián)網(wǎng)、實時數(shù)據(jù)推送等場景,跨平臺且兼顧性能與易用性,是 C++ 開發(fā) WebSocket 的可靠工具(websocketpp既支持http模式又支持websocket模式)。

websocketpp安裝教程

  1. 打開終端,使用以下命令安裝所需的開發(fā)包:
    sudo apt-get install libboost-dev libboost-system-dev libwebsocketpp-dev
    
  2. 安裝完成后,在 /usr/include 目錄下檢查是否存在 websocketpp 目錄。可以通過以下命令查看:
    ls /usr/include/websocketpp/
    

如果存在該目錄及其包含的文件(如示例中的 base64、common、connection.hpp 等),則表示安裝成功。

基于websocketpp實現(xiàn)簡單websocket通信測試

經(jīng)常使用的接口

server類相關(guān)接口
  1. set_access_channels(log::level channels):設(shè)置日志輸出等級。
  2. set_open_handler(open_handler h):連接握手成功后的回調(diào)處理函數(shù)設(shè)置。
  3. set_close_handler(close_handler h):連接關(guān)閉前的回調(diào)處理函數(shù)。
  4. set_message_handler(message_handler h):websocket消息處理回調(diào)函數(shù)。
  5. send(connection_hdl hdl, std::string& payload, frame::opcode::value op):向指定連接發(fā)送消息,需指定連接句柄、消息負載和操作碼。
  6. close(connection_hdl hdl, close::status::value code, std::string& reason):關(guān)閉指定連接,需指定連接句柄、關(guān)閉狀態(tài)碼和關(guān)閉原因。
  7. get_con_from_hdl(connection_hdl hdl):根據(jù)連接句柄獲取通信連接對象。
  8. init_asio():初始化asio框架。
  9. set_reuse_addr(bool value):設(shè)置是否啟用地址重用。
  10. listen(uint16_t port):設(shè)置監(jiān)聽端口。
  11. start_accept():開始監(jiān)聽連接。
  12. run():啟動服務(wù)器。
connection類相關(guān)接口
  1. error_code send(std::string& payload, frame::opcode::value op = frame::opcode::text):發(fā)送消息,可指定消息負載和操作碼,默認操作碼為文本類型。
message_buffer類相關(guān)接口
  1. std::string const & get_payload():取消息中的有效載荷數(shù)據(jù)。

構(gòu)建websocket通信基本步驟

  1. 初始化日志輸出,關(guān)閉日志輸出。
  2. 初始化asio框架。
  3. 設(shè)置消息處理、連接握手成功及連接關(guān)閉的回調(diào)函數(shù)。
  4. 設(shè)置監(jiān)聽端口。
  5. 開始監(jiān)聽。
  6. 啟動服務(wù)器。

websocket通信實現(xiàn)

測試效果

  • 啟動服務(wù)端監(jiān)聽。

  • 添加對應(yīng)前端請求websocket服務(wù)的代碼。

  • 轉(zhuǎn)化成html打開。


  • 啟動調(diào)試界面模式。

  • 點擊提交發(fā)送對應(yīng)的websocket請求。

  • 這里可以看到服務(wù)端接收到了請求以及基于websocket通信的時候,服務(wù)端返回來的信息。
代碼匯總

test.cc:

#include <websocketpp/config/asio_no_tls.hpp> //websocketpp底層的框架
#include <websocketpp/server.hpp>

typedef websocketpp::server<websocketpp::config::asio> server_t;
void openhl(websocketpp::connection_hdl hdl)
{
    std::cout << "websocket長連接建立成功!\n";
}
void closehl(websocketpp::connection_hdl hdl)
{
    std::cout << "websocket長連接斷開!\n";
}
void messagehl(server_t *server, websocketpp::connection_hdl hdl, server_t::message_ptr msg)
{

     //hdl 是個弱指針不管理資源:typedef lib::weak_ptr<void> connection_hdl;
    auto con = server->get_con_from_hdl(hdl);//需要server的接口故需要傳遞對應(yīng)的server對象
    std::string body = msg->get_payload();
    con->send(body + "----> 這是server發(fā)來的答復(fù)!?。。?, websocketpp::frame::opcode::value::text);
}
int main()
{

    // 構(gòu)建websocketpp對象:
    server_t sr;

    // 關(guān)閉對應(yīng)的默認日志輸出:
    sr.set_access_channels(websocketpp::log::alevel::none);

    // 初始化底層asio框架:
    sr.init_asio();

    // 設(shè)置打開連接+關(guān)閉連接+收到消息的回調(diào)函數(shù)
    // typedef lib::function<void(connection_hdl)> close_handler;
    sr.set_open_handler(openhl);
    sr.set_close_handler(closehl);
    //這里只能傳遞(回調(diào)函數(shù))一個是連接一個是對應(yīng)消息,因此需要bind:

    auto mshl=bind(messagehl,&sr,std::placeholders::_1,std::placeholders::_2);
    sr.set_message_handler(mshl);

    // 啟動地址重用:

    sr.set_reuse_addr(1);

    //  設(shè)置監(jiān)聽端口
    sr.listen(8997);
    //    開始監(jiān)聽
    sr.start_accept();
    //    啟動服務(wù)器
    sr.run(); // 進行阻塞運行,故要先監(jiān)聽再啟動
    return 0;
}

makefile:

test : test.cc
	g++ -std=c++17 $^ -o $@ -lpthread -lboost_system

三.本篇小結(jié)

cpp - httplib 以單文件、跨平臺、功能全的特點,簡化 C++ 項目 HTTP 通信開發(fā);websocketpp 讓 C++ 實現(xiàn) WebSocket 通信更便捷,二者都是開發(fā)者實用工具。

到此這篇關(guān)于cpp-httplib和websocketpp哪個好,C++如何實現(xiàn)WebSocket實時通信?的文章就介紹到這了,更多相關(guān)cpp-httplib和websocketpp哪個好內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 實現(xiàn)求小于n的最大素數(shù)的實例

    C++ 實現(xiàn)求小于n的最大素數(shù)的實例

    這篇文章主要介紹了C++ 實現(xiàn)求小于n的最大素數(shù)的實例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++內(nèi)存泄漏及檢測工具詳解

    C++內(nèi)存泄漏及檢測工具詳解

    最簡單的方法當然是借助于專業(yè)的檢測工具,比較有名如BoundsCheck,功能非常強大,相信做C++開發(fā)的人都離不開它。此外就是不使用任何工具,而是自己來實現(xiàn)對內(nèi)存泄露的監(jiān)控
    2013-10-10
  • C語言求逆矩陣案例詳解

    C語言求逆矩陣案例詳解

    這篇文章主要介紹了C語言求逆矩陣案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++共享智能指針shared_ptr的實現(xiàn)

    C++共享智能指針shared_ptr的實現(xiàn)

    在C++中沒有垃圾回收機制,必須自己釋放分配的內(nèi)存,否則就會造成內(nèi)存泄露,解決這個問題最有效的方法是使用智能指針,本文主要介紹了C++共享智能指針shared_ptr的實現(xiàn),感興趣的可以了解一下
    2023-12-12
  • C語言可變參數(shù)函數(shù)詳解示例

    C語言可變參數(shù)函數(shù)詳解示例

    一般我們編程的時候,函數(shù)中形式參數(shù)的數(shù)目通常是確定的,在調(diào)用時要依次給出與形式參數(shù)對應(yīng)的實際參數(shù)。但在某些情況下我們希望函數(shù)的參數(shù)個數(shù)可以根據(jù)需要確定,因此c語言引入可變參數(shù)函數(shù)。典型的可變參數(shù)函數(shù)的例子有printf()、scanf()等,下面我就開始講解
    2013-11-11
  • Qt5 串口類QSerialPort的實現(xiàn)

    Qt5 串口類QSerialPort的實現(xiàn)

    在Qt5以上提供了QtSerialPort模塊,方便編程人員快速的開發(fā)應(yīng)用串口的應(yīng)用程序。本文主要介紹了Qt5 串口類QSerialPort的實現(xiàn),,感興趣的可以了解一下
    2022-05-05
  • 最新評論

    临夏市| 西乌珠穆沁旗| 酉阳| 嘉义市| 康平县| 龙南县| 新竹市| 武安市| 长沙市| 锦州市| 红原县| 灌云县| 张掖市| 吉水县| 平凉市| 乐安县| 霍城县| 句容市| 浮山县| 宣恩县| 博湖县| 普陀区| 九龙坡区| 柳河县| 花垣县| 永昌县| 罗田县| 理塘县| 越西县| 东源县| 通城县| 双鸭山市| 信丰县| 南昌市| 扶绥县| 东方市| 资溪县| 怀来县| 龙胜| 甘肃省| 兴业县|