使用websocketpp实现c++ websocket通讯

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/asoi_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 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对象其实还提供了很多的使用方法以及回调绑定功能,等有时间我再详细研究,现在这几个已经能满足我的需求了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容