C++跨平台集成websocketpp
之前给公司写了一个用于消息交互的服务器,移植到Linux上之后发现H5-Websocket模块经常出问题,而该模块是另一位已经离职同事编写的,所以修改和维护都存在一定的困难,索性就直接把这个模块替换掉。从搜索考察websocket的开源库,到最终代码编好替换掉模块,并稳定运行总共耗时4天左右(使用第三方开源库确实提升了非常大的开发效率,想当初那个离职同事搞了差不多一个月,还不包括后面的各种Bug修改和功能改进)
好了,废话不多说,最初我在网上找到Websocket的开源库有好几个,但最终选择了Websocketpp这个库,主要是因为其不需要额外的编译库,也就是说不需要再去编什么lib(Windows)、点a点o(Linux)等库文件。以下是我具体的集成步骤:
1. boost安装
Websocketpp是基于boost::asio开发的一个C++协议库,你的电脑上需要首先安装boost::asio,我选择的是完整安装boost(主要怕万一还得用到其他库,一次性装完方便些)。boost版本我选择的是1.67.0。
1.1 boost下载
大家可以在以下网址处,找到1.67.0的Windows和Linux下载链接。
http://www.boost.org/users/history/version_1_67_0.html
下载完毕后,就要对boost进行编译和安装
1.2 Windows
a. 解压缩下载好的文件,进入源码目录,执行bootstrap.bat批处理文件,结束后会在源码根目录下生成b2.exe和bjam.exe两个文件。
b. 通过命令行执行
bjam.exe stage --toolset=msvc-10.0 architecture=x86 address-model=64 link=static --build-type=complete --with-system --with-thread --with-date_time --with-filesystem --with-serialization \
--stagedir=库文件路径
参数解释:
stage 表示仅生成库文件,因为源码下的boost目录已经包含了完整的头文件
--toolset 表示使用哪个版本的vs编译器来编译boost,具体vs版本与这里填写的数字对应关系,请自行搜索
architecture 表示编译时基于的处理器平台,需按照自己的电脑真实配置填写,但通常都是x86
address-model 表示编译为64位还是32位库
link 表示链接为静态库(库文件较大),如果填shared则表示链接为动态库(库文件较小)
--build-type 表示编译类型,填complete则是完整编译
--stagedir 表示生成库文件的保存路径
c. 等待编译结束后(大概需要几分钟),可以在库文件保存路径下看到很多名字很长的lib文件(共享库的话,是lib和dll),具体boost库文件的命名规范
可以自行搜索学习。
接下来在需要使用到Websocketpp库的vs工程里,把boost的头文件目录和库文件目录配置进来即可。
1.3 Linux
a. 同样是解压缩下载好的源码包,进入源码目录,执行
./bootstrap.sh --prefix=/usr/local/boost --with-libraries=all --with-toolset=gcc
执行结束后会生成b2和bjam,上面参数中prefix表示编译后库文件和头文件的安装目录,with-libraries表示需要编译哪些库(all表示所有库),with-toolset表示使用的编译器
这里boost-1.67在哪些gcc版本下测试通过可运行,需要自己到官网上进行查询。我的Linux为CentOS6.6,gcc版本是4.9.4,如果gcc版本不符合的话,建议对gcc进行升级。下面是官网上查到的1.67.0测试通过的一些编译器以及对应的版本
b. 执行 ./b2 toolset=gcc进行编译,完了之后再执行 ./b2 install进行安装即可。
c. boost安装完毕后,需要将boost的头文件目录和库文件目录添加到环境变量中,头文件是CPLUS_INCLUDE_PATH和C_INCLUDE_PATH,库文件是LIBRARY_PATH和LD_LIBRARY_PATH,具体如何添加这里就不赘述。不过有个地方需要注意,就是boost的头文件目录一定要放在系统的头文件目录之后,Websocketpp头文件目录之前,且不能将boost的头文件目录放到系统头文件目录之下,可能会导致你的程序在make时报一些对象未定义。
2. Websocketpp安装
2.1 下载
可以在Github上找到该项目,我下载的是master版本,如果该项目有更新那么master对应的版本号可能会有出入。
https://github.com/zaphoyd/websocketpp
2.2 Windows
解压缩文件后,源码目录中的websocketpp下就是我们需要的所有头文件,不需要额外的编译,将其放到合适的位置并引入到vs的工程中即可。
2.3 Linux
解压缩文件后,将websocketpp放到合适的位置,并添加到两个头文件的环境变量中,注意要放在boost的头文件目录之后。
3. Websocketpp使用
3.1 整体使用流程
从Websocketpp的例子中,拷贝需要用到的头文件包含和一些类型重定义
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
using websocketpp::connection_hdl;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
typedef websocketpp::server<websocketpp::config::asio> server;
typedef server::message_ptr message_ptr;
生成server对象
server m_server;
初始化m_server
m_server.set_access_channels(websocketpp::log::alevel::none); // 设置打印的日志等级 m_server.init_asio(); // 初始化asio m_server.set_open_handler(bind(&XXXClass::on_open_func_ptr, this, ::_1)); // 绑定websocket连接到来时的回调函数
m_server.set_close_handler(bind(&XXXClass::on_close_func_ptr, this, ::_1)); // 绑定websocket连接断开时的回调函数
m_server.set_message_handler(bind(&XXXClass::on_message_func_ptr, this, ::_1, ::_2)); // 绑定websocket连接有消息到来时的回调函数
上面三个回调函数的原型如下,我是将server对象直接封装到一个类里面使用的,因此这里绑定的回调函数可以直接使用类的方法。Websocketpp也提供了其他很多环节上的回调函数设定,可自行查看其源代码进行了解。
class XXXClass
{
public :
void on_open_func_ptr(connection_hdl hdl);
void on_close_func_ptr(connection_hdl hdl);
void on_message_func_ptr(connection_hdl hdl, message_ptr msg);
}
回调参数中的connection_hdl是一个weak_ptr,如果需要将连接存到容器中以便管理,则不能使用传入的hdl,需要使用
server::connection_ptr con = m_server.get_con_from_hdl(hdl);
获得的con是个shared_ptr,再调用
void *con_ptr = con->get();
可以得到这个连接的实际对象的地址,但websocketpp对我们隐藏了其对象的结构,只给了我们一个void*,不过用于在每次回调时区分不同的客户端足够了。
当websocket有新消息到来时,我们可以通过
std::string msg_str = msg->get_payload();
直接获取到传输的内容。
以上,就是websocketpp集成后的简单使用流程,server对象其实还提供了很多的使用方法以及回调绑定功能,等有时间我再详细研究,现在这几个已经能满足我的需求了。
C++跨平台集成websocketpp的更多相关文章
- Clion 跨平台的C++ IDE
CLion 是 JetBrains 推出的全新的 C/C++ 跨平台集成开发环境. 正式版本已经发出,目前是1.0.1 http://www.jetbrains.com/clion/ http://b ...
- 【转贴】-- 基于QT的跨平台应用开发
原帖地址:http://www.cnblogs.com/R0b1n/p/4106613.html 1 Qt简介 Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架.它提供给应用程 ...
- 基于Qt5 跨平台应用开发
1.Qt简介 2.Qt 编程关键技术 2.1 信号与槽 2.2 Qt事件处理 3.Qt开发与实例分析 3.1 开发环境 3.2 系统实现基本框架 3.3 数据库管理 3.5 对Excel进行操作 4. ...
- 使用WCF进行跨平台开发之一(WCF的实现、控制台托管与.net平台的调用)
WCF是Windows Communication Foundation的缩写,是微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,是WinFx的三个重要开发类库之一,其它两个是WP ...
- NancyFX 简介
Nancy是.NET 平台的微框架.在受到Ruby社区的Sinatra框架启发下,NancyFx框架提供一个.NET平台下的低门槛.易上手的可用于Web开发工具包. 请注意我说的是可用于Web开发,这 ...
- 开源免费的HTML5游戏引擎
青瓷引擎的成长 青瓷引擎自2015年4月项目启动开始,7月首次亮相2015年ChinaJoy,便得到业界的极大关注,随后开启限量测试,收到数百个开发者团队的试用申请及反馈,期间经历了18个内测版本,完 ...
- 开源免费的HTML5游戏引擎——青瓷引擎(QICI Engine) 1.0正式版发布了!
青瓷引擎的成长 青瓷引擎自2015年4月项目启动开始,7月首次亮相2015年ChinaJoy,便得到业界的极大关注,随后开启限量测试,收到数百个开发者团队的试用申请及反馈,期间经历了18个内测版本,完 ...
- Eclipse常用开发插件
以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1) AmaterasUML 介绍:Eclipse的UML插件,支持UML活动图,class图,sequen ...
- 转:Eclipse常用开发插件
以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1) AmaterasUML 介绍:Eclipse的UML插件,支持UML活动图,class图,sequen ...
随机推荐
- python简单爬虫 用lxml库解析数据
目标:爬取湖南大学2018年本科招生章程 url:http://admi.hnu.edu.cn/info/1026/2993.htm 页面部分图片: 使用工具: Python3.7 火狐浏览器 PyC ...
- 一个C++右值引用的问题
暂时先不更新前一篇文章了,感觉那个文章要写好久.累死. 今天说一说C++右值引用的一个问题. 这个问题的发现也是很偶然的. 来一段毫无意义但是能证明问题的代码: std::string &&a ...
- Excel--------实用功能(数据对比)
--excel数据在sql中查询展示出来 SELECT * FROM (SELECT '101001' as code ,'上海宝山站' as name union allSELECT '102083 ...
- SQL server 一些小结
数据库表常用术语 关系 关系即二维表,每一个关系都有一个关系名,就是表名记录 表中的行字段 表中的列 也称属性域 取值范围关联 不同数据库表之间的数据联系关键字 属性或属性的组合,可以用于唯一标识一条 ...
- Problem B: 一切皆对象
Description 一切都是对象 —— Everything is an object. 所以,现在定义一个类Thing,来描述世界上所有有名字的事物.该类只有构造函数.拷贝构造函数和析构函数,并 ...
- MySQL父子节点查询
MySQL父子结点递归查询 表结构: CREATE TABLE `agency` ( `id` ) NOT NULL COMMENT '编号', `name` ) NOT NULL COMMENT ' ...
- Intellij idea 2018的注册方式
激活方式:License Server 第一步: 将地址 http://active.chinapyg.com/ 或者 http://idea.toocruel.net 任意一个复制到License ...
- 酷学习笔记——ASP.NET Core 简介
ASP.NET Core 简介 其实就是说酷好,不好好学,不学好,没饭吃. 新词汇:IoT,Internet of Things,网联网,微软物联网英文网站.微软物联网中文网站
- Django中STATIC_URL、STATIC_ROOT、STATICFILES_DIRS 的区别关系
首先,我们配置静态文件,要在setting.py里面加入如下几行代码: settings.py # the settings above # STATIC SETTINGS STATIC_URL = ...
- tcp 与udp 的区别
1.TCP和UDP对比 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用 ...