C++ 网络通信实践:cpp-httplib 与 websocketpp 入门指南,轻松实现 HTTP 与 WebSocket 交互 文章目录本篇摘要一.cpp-httplib介绍及使用介绍**1. 基本定义****2. 核心特点****3. 主要功能****4. 适用场景****5. 优势总结**简单回调机制安装教程简单操作二.Websocket/Websocketpp介绍与使用背景引入websocket简单原理websocketpp介绍websocketpp安装教程基于websocketpp实现简单websocket通信测试经常使用的接口server类相关接口connection类相关接口message_buffer类相关接口构建websocket通信基本步骤websocket通信实现测试效果代码汇总三.本篇小结本篇摘要本文介绍cpp - httplib 和 websocketpp 两个 C 库。前者轻量易用支持 HTTP/HTTPS 客户端和服务端适用于多种场景后者遵循 RFC 6455实现 WebSocket 全双工通信帮助实现实时应用开发。一.cpp-httplib介绍及使用介绍1. 基本定义轻量级 C HTTP 库仅单个头文件httplib.h无需复杂依赖。支持 HTTP/HTTPS协议同时提供客户端和服务端功能。2. 核心特点单文件集成只需包含httplib.h即可使用无额外库依赖。跨平台兼容支持Windows、Linux、macOS等主流操作系统。简单易用API 设计直观代码简洁易于集成与使用。高性能基于高效 I/O 模型适用于高并发网络通信场景。功能全面支持多种 HTTP 方法GET、POST等、Header 管理、Cookie、文件上传、HTTPS 加密等。3. 主要功能客户端功能发送各类 HTTP 请求GET、POST、PUT、DELETE等。支持设置请求头、Body 数据、超时控制等。处理响应数据包括状态码、响应头和 Body 内容。服务端功能快速搭建 HTTP 服务监听指定端口。处理不同路由的请求支持自定义响应逻辑。支持多线程、异步处理提升并发性能。4. 适用场景客户端应用调用 RESTful API、爬虫程序、自动化脚本、HTTP 客户端工具等。服务端开发快速构建轻量级 Web 服务、API 接口、微服务、测试服务器等。嵌入式系统适用于资源受限环境下的 HTTP 通信需求。5. 优势总结轻量化单文件设计易于集成与维护。高效性高性能网络通信适合高并发应用。灵活性丰富的功能支持满足多种 HTTP 通信需求。易用性简洁的 API 设计降低开发门槛提升开发效率。简单来说httplib凭借它的轻量化与简单易用根据标签调用对应回调函数完成处理并且能够及时更新对应功能的特点值得点赞C 开发者需要在项目中实现 HTTP 通信时cpp-httplib 是一个理想的选择。简单回调机制通过路由标签如/api绑定回调函数当请求匹配标签时自动触发对应处理逻辑 。服务端使用Server类的.Get()/.Post()等方法注册标签和回调svr.Get(/user,constRequest,Response{/* 处理逻辑 */});标签即路由路径如/login回调函数接收请求和响应对象。特点精准匹配按路径标签分发请求灵活处理回调内可自定义状态码、响应头、Body内容轻量级无复杂路由框架直接通过标签绑定逻辑如图所示本质用字符串标签路由作为键回调函数作为值的简易路由表机制。安装教程这里可以直接git clone即可:https://github.com/yhirose/cpp-httplib下载后可以看到对应里面内容这里我们只需要用到对应头文件httplib.h就够了。简单操作效果展示httplib服务端成功启动。访问对应路径就能收到对应答复。简单机制其实这里就是客户访问的时候发对象请求发给对应httplib然后它提取内部的路径解析出来拿着回调函数表去匹配最后执行完拿到对应response进行组织发送回去。测试代码#include../../common/httplib.hintmain(){// 1. 实例化服务器对象httplib::Server server;// 2. 注册回调函数 void(const httplib::Request , httplib::Response )server.Get(/httplib,[](consthttplib::Requestreq,httplib::Responsersp){std::coutreq.methodstd::endl;std::coutreq.pathstd::endl;std::coutreq.matched_routestd::endl;for(autoit:req.headers){std::coutit.first: it.secondstd::endl;}std::string bodyhttplib-test;rsp.set_content(body,text/html);rsp.status200;});//server.Post() //这里其实就是对应发来的request里面有对应body进行提取解析后再由服务器进行答复即可// 3. 启动服务器server.listen(0.0.0.0,8081);return0;}二.Websocket/Websocketpp介绍与使用背景引入比如使用httplib的时候是一问一答(客户端请求服务端给出回答)但是服务端不能像客户端端主动推送如果只是使用原生的 HTTP 协议要想实现消息推送一般需要通过 “轮询” 的方式实现 而轮询的成本比较高并且也不能及时的获取到消息的响应因此websocket就诞生了允许客户端与服务端之间建立长连接然后完成服务端的主动推送。websocket简单原理WebSocket协议的本质是一个基于TCP的协议 客户端浏览器首先向服务器发起一个HTTP请求与通常的HTTP请求不同包含一些附加头信息通过这些附加头信息来完成握手过程以及协议升级过程。对应操作图协议升级报文交互格式报文格式:下面解析下1. 控制标志位Control Flags字段位数说明FIN1 bit最终帧标记1 当前帧是消息的最后一帧0 消息未结束后续还有帧支持分片传输。RSV1、RSV2、RSV3各 1 bit保留位默认值为0若协议扩展如压缩启用时可能被使用否则必须为0。2. 操作码Opcode字段位数说明4 位 Opcode4 bits定义帧类型常见值-0x0继续帧-0x1文本数据-0x2二进制数据-0x8关闭连接-0x9Ping心跳检测-0xAPong响应 Ping3. 掩码Mask字段位数说明MASK1 bit是否掩码1 Payload 数据经过掩码处理客户端发送到服务器时必须为1服务器返回时必须为0。4. Payload 长度Payload Length字段位数说明7 位 Payload 长度7 bits基础长度表示 Payload 长度 ≤ 125。若长度 125则需扩展字段-16 位 Payload 长度长度 ≤ 65535-32 位 Payload 长度长度 65535超大消息5. 掩码密钥Mask-Key字段位数说明Mask-Key0 或 4 字节仅当 MASK1 时存在客户端发送时随机生成 4 字节密钥用于对 Payload 数据进行异或掩码处理。服务器解码时需用相同密钥还原数据。6. Payload 数据Payload Data字段说明Payload 数据实际传输的消息内容长度由 Payload Length 决定类型由 Opcode 定义文本、二进制等。关键规则总结客户端必须对出站消息加掩码MASK1服务器必须验证并解码。服务器不得对出站消息加掩码MASK0否则客户端会拒绝连接。Opcode 决定数据处理方式如文本、二进制、关闭连接等。分片传输通过 FIN0 和 Opcode0继续帧实现大消息拆分。控制帧如 Ping/Pong/Close通常不掩码且长度较小≤125字节。也正是通过以上字段的组合WebSocket 实现了高效、灵活的全双工通信。websocketpp介绍WebSocketpp 是C 语言的 WebSocket 协议库严格遵循 RFC 6455 标准支持构建客户端/服务器实现全双工实时通信。它提供文本/二进制数据传输、握手升级、连接管理等核心功能基于 Boost.Asio可无 Boost 配置采用事件驱动回调机制支持 Ping/Pong 心跳和 SSL/TLS 加密wss://。适用于游戏、物联网、实时数据推送等场景跨平台且兼顾性能与易用性是 C 开发 WebSocket 的可靠工具websocketpp既支持http模式又支持websocket模式。websocketpp安装教程打开终端使用以下命令安装所需的开发包sudoapt-getinstalllibboost-dev libboost-system-dev libwebsocketpp-dev安装完成后在/usr/include目录下检查是否存在websocketpp目录。可以通过以下命令查看ls/usr/include/websocketpp/如果存在该目录及其包含的文件如示例中的base64、common、connection.hpp等则表示安装成功。基于websocketpp实现简单websocket通信测试经常使用的接口server类相关接口set_access_channels(log::level channels)设置日志输出等级。set_open_handler(open_handler h)连接握手成功后的回调处理函数设置。set_close_handler(close_handler h)连接关闭前的回调处理函数。set_message_handler(message_handler h)websocket消息处理回调函数。send(connection_hdl hdl, std::string payload, frame::opcode::value op)向指定连接发送消息需指定连接句柄、消息负载和操作码。close(connection_hdl hdl, close::status::value code, std::string reason)关闭指定连接需指定连接句柄、关闭状态码和关闭原因。get_con_from_hdl(connection_hdl hdl)根据连接句柄获取通信连接对象。init_asio()初始化asio框架。set_reuse_addr(bool value)设置是否启用地址重用。listen(uint16_t port)设置监听端口。start_accept()开始监听连接。run()启动服务器。connection类相关接口error_code send(std::string payload, frame::opcode::value op frame::opcode::text)发送消息可指定消息负载和操作码默认操作码为文本类型。message_buffer类相关接口std::string const get_payload()取消息中的有效载荷数据。构建websocket通信基本步骤初始化日志输出关闭日志输出。初始化asio框架。设置消息处理、连接握手成功及连接关闭的回调函数。设置监听端口。开始监听。启动服务器。websocket通信实现测试效果启动服务端监听。添加对应前端请求websocket服务的代码。转化成html打开。启动调试界面模式。点击提交发送对应的websocket请求。这里可以看到服务端接收到了请求以及基于websocket通信的时候服务端返回来的信息。代码汇总test.cc:#includewebsocketpp/config/asio_no_tls.hpp//websocketpp底层的框架#includewebsocketpp/server.hpptypedefwebsocketpp::serverwebsocketpp::config::asioserver_t;voidopenhl(websocketpp::connection_hdl hdl){std::coutwebsocket长连接建立成功\n;}voidclosehl(websocketpp::connection_hdl hdl){std::coutwebsocket长连接断开\n;}voidmessagehl(server_t*server,websocketpp::connection_hdl hdl,server_t::message_ptr msg){//hdl 是个弱指针不管理资源:typedef lib::weak_ptrvoid connection_hdl;autoconserver-get_con_from_hdl(hdl);//需要server的接口故需要传递对应的server对象std::string bodymsg-get_payload();con-send(body---- 这是server发来的答复,websocketpp::frame::opcode::value::text);}intmain(){// 构建websocketpp对象server_t sr;// 关闭对应的默认日志输出sr.set_access_channels(websocketpp::log::alevel::none);// 初始化底层asio框架sr.init_asio();// 设置打开连接关闭连接收到消息的回调函数// typedef lib::functionvoid(connection_hdl) close_handler;sr.set_open_handler(openhl);sr.set_close_handler(closehl);//这里只能传递回调函数一个是连接一个是对应消息因此需要bindautomshlbind(messagehl,sr,std::placeholders::_1,std::placeholders::_2);sr.set_message_handler(mshl);// 启动地址重用sr.set_reuse_addr(1);// 设置监听端口sr.listen(8997);// 开始监听sr.start_accept();// 启动服务器sr.run();// 进行阻塞运行故要先监听再启动return0;}makefile:test:test.cc g-stdc17$^-o $-lpthread-lboost_system三.本篇小结cpp - httplib 以单文件、跨平台、功能全的特点简化 C 项目 HTTP 通信开发websocketpp 让 C 实现 WebSocket 通信更便捷二者都是开发者实用工具。