基于websocketpp库的websocket服务器例程

WEBSOCKETPP使用简介+demo 上面三个回调函数的原型如下,我是将server对象直接封装到一个类里面使用的,因此这里绑定的回调函数可以直接使用类的方法。以上,就是websocketpp集成后的简单使用流程,server对象其实还提供了很多的使用方法以及回调绑定功能,等有时间我再详细研究,现在这几个已经能满足我的需求了。可以得到这个连接的实际对象的地址,但websocketpp对我们隐藏了其对象的结构,只给了我们一个。,如果需要将连接存到容器中以便管理,则不能使用传入的。,不过用于在每次回调时区分不同的客户端足够了。... 阅读详情

使用websocketpp,需要安装boost。

解压 boost_1_73_0.tar.gz

tar -zvfx boost_1_73_0.tar.gz

运行bootstrap.sh后,生成b2,直接运行b2;如果需要移植到ARM平台,则需要在project-config.jam文件将using gcc修改如下:

using gcc : : arm-linux-gnueabihf-gcc;

生成的库文件在stage目录中。

下面是websocket服务器例程,该服务器功能用于推送数据到客户端,对连接到服务器的客户端,服务器定时推送数据到客户端。这里简单实现了两个推送地址,分别为ws://localhost:9000/push/helloworld和ws://localhost:9000/current/status。

#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

#include <set>
#include <string>
#include <iostream>

/*
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>*/
#include <websocketpp/common/thread.hpp>

typedef websocketpp::server<websocketpp::config::asio> server;

using websocketpp::connection_hdl;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

using websocketpp::lib::thread;
using websocketpp::lib::mutex;
using websocketpp::lib::lock_guard;
using websocketpp::lib::unique_lock;
using websocketpp::lib::condition_variable;

enum action_type {
    SUBSCRIBE,
    UNSUBSCRIBE,
    MESSAGE
};

typedef server::message_ptr message_ptr;

struct action {
    action(action_type t, std::string s, connection_hdl h) : type(t), struri(s), hdl(h) {}
    action(action_type t, std::string s, connection_hdl h, server::message_ptr m)
      : type(t), struri(s), hdl(h), msg(m) {}

    action_type type;
    std::string struri;
    websocketpp::connection_hdl hdl;
    server::message_ptr msg;
};

/**************************************************************************************************/ 
class broadcast_server {
public:
    broadcast_server() {
        // Initialize Asio Transport
        m_server.init_asio();
        // 连接打开回调函数
        m_server.set_open_handler(bind(&broadcast_server::on_open,this,::_1));
	    //连接关闭回调函数
        m_server.set_close_handler(bind(&broadcast_server::on_close,this,::_1));
	    //接收websocket数据回调函数
        m_server.set_message_handler(bind(&broadcast_server::on_message,this,::_1,::_2));
    }

    void run(uint16_t port) {
        m_server.listen(port);
        m_server.start_accept();

        set_helloworld_timer();
	    set_status_timer();

        try {
            m_server.run();
        } catch (const std::exception & e) {
            std::cout << e.what() << std::endl;
        }
    }


    void set_status_timer() {
        m_sensor_timer = m_server.set_timer(
            10000,
            websocketpp::lib::bind(
                &broadcast_server::robot_status,
                this,
                websocketpp::lib::placeholders::_1
            )
        );
    }

    void robot_status(websocketpp::lib::error_code const & ec) {
        if (ec) {
            m_server.get_alog().write(websocketpp::log::alevel::app, "Timer Error: "+ec.message());
            return;
        }
        
        std::stringstream val;
	    std::string data = struct_robot_status();
        val << "current status \r\n";
        con_list::iterator it;
        for (it = m_status_connections.begin(); it != m_status_connections.end(); ++it) {
	    m_server.send(*it,val.str(),websocketpp::frame::opcode::text);
        }       
	    set_status_timer();
    }
    /************************************************************************/
    void set_helloworld_timer() {
        m_helloworld_timer= m_server.set_timer(
            2000,
            websocketpp::lib::bind(
                &broadcast_server::sensor_value,
                this,
                websocketpp::lib::placeholders::_1
            )
        );
    }

    void helloworld_routine(websocketpp::lib::error_code const & ec) {
        if (ec) {
            m_server.get_alog().write(websocketpp::log::alevel::app, "Timer Error:                 "+ec.message());
            return ;
        }
        
        std::stringstream val;
	    std::string data = struct_sensor_data();
        val << "hello world \r\n";
        con_list::iterator it;
        for (it = m_sensor_connections.begin(); it != m_sensor_connections.end(); ++it) {
	        m_server.send(*it, val.str(), websocketpp::frame::opcode::text);
        } 
        set_helloworld_timer();
    }
    /************************************************************************/
    void on_open(connection_hdl hdl) {
        {
            lock_guard<mutex> guard(m_action_lock);
	    server::connection_ptr con = m_server.get_con_from_hdl(hdl);	
	    websocketpp::http::parser::request rt = con->get_request();
            m_actions.push(action(SUBSCRIBE, rt.get_uri(), hdl));
        }
        m_action_cond.notify_one();
    }

    void on_close(connection_hdl hdl) {
        {
            lock_guard<mutex> guard(m_action_lock);
	    server::connection_ptr con = m_server.get_con_from_hdl(hdl);	
	    websocketpp::http::parser::request rt = con->get_request();
            m_actions.push(action(UNSUBSCRIBE, rt.get_uri(), hdl));
        }
        m_action_cond.notify_one();
    }

    void on_message(connection_hdl hdl, server::message_ptr msg) {
        {
            lock_guard<mutex> guard(m_action_lock);
	    server::connection_ptr con = m_server.get_con_from_hdl(hdl);	
	    websocketpp::http::parser::request rt = con->get_request();
            m_actions.push(action(MESSAGE, rt.get_uri(), hdl, msg));
        }
        m_action_cond.notify_one();
    }

    void process_messages() {
        while(1) {
            unique_lock<mutex> lock(m_action_lock);

            while(m_actions.empty()) {
                m_action_cond.wait(lock);
            }

            action a = m_actions.front();
            m_actions.pop();

            lock.unlock();

    	    if(0 == a.struri.compare(std::string("/push/helloworld"))) {
            	if (a.type == SUBSCRIBE) {
                	lock_guard<mutex> guard(m_connection_lock);
                	m_helloworld_connections.insert(a.hdl);
            	} else if (a.type == UNSUBSCRIBE) {
                	lock_guard<mutex> guard(m_connection_lock);
                	m_helloworld_connections.erase(a.hdl);
            	} else if (a.type == MESSAGE) {
                	lock_guard<mutex> guard(m_connection_lock);
            	} else {
                	// undefined.
            	}
    	    } else if(0 == a.struri.compare(std::string("/current/status"))) {
            	if (a.type == SUBSCRIBE) {
                	lock_guard<mutex> guard(m_connection_lock);
                	m_status_connections.insert(a.hdl);
            	} else if (a.type == UNSUBSCRIBE) {
                	lock_guard<mutex> guard(m_connection_lock);
                	m_status_connections.erase(a.hdl);
            	} else if (a.type == MESSAGE) {
                	lock_guard<mutex> guard(m_connection_lock);
            	} else {
                	// undefined.
            	}
	        } else {

	        }
        }
    }

private:
    typedef std::set<connection_hdl,std::owner_less<connection_hdl> > con_list;

    server m_server;
    server::timer_ptr m_helloworld_timer;
    server::timer_ptr m_status_timer;
    con_list m_helloworld_connections;
    con_list m_status_connections;
    std::queue<action> m_actions;

    mutex m_action_lock;
    mutex m_connection_lock;
    condition_variable m_action_cond;
};

int main(int argc, char *argv[])
{
    try {
	broadcast_server server_instance;
	thread t(bind(&broadcast_server::process_messages,&server_instance));
	server_instance.run(9000);
	t.join();
    } catch (websocketpp::exception const & e) {
        std::cout << e.what() << std::endl;
    }

    return 0;
}

编译命令:

g++ -std=gnu++14 -o server websocket_server.cpp -I/DIR/websocketpp -I/DIR/boost/include -L/DIR/boost/lib -lboost_system -lboost_chrono -lpthread

 

websocketpp的使用和boost库的交叉编译 最近使用嵌入编程时需要使用websocket。在github上查找开源库时,主要有两个库点赞比较高的,其中一个是websocketpp这个库。此库需要使用boost库进行编译。所以本文章主要介绍boost库的交叉编译和在程序中使用websocketpp。 boost库交叉编译 从boost官网上下载最新的boost库boost官网 等待下载完成之后,放入到虚拟机中(ubuntu),使用命令:tar jxvf boost_1_73_0.tar.bz2 将其解压。 cd boost_1_73_0 ./boots 阅读详情

相关推荐

【C++】开源:websocketpp安装与使用

websocketpp学习

DevFrank的博客 4438

WebSocketpp

WebSocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得 CS 之间的数据交换变得更加简单,允许 S 主动向 C 推送数据。WebSocket 和 HTTP 一样都是应用层的一种协议,可以使用各种编程语言实现之。WebSocketpp 是一个仅仅由头文件构成的 C++库,它实现了 WebSocket 协议(rfc 6455),可以在项目中方便简洁地实现客户端和服务器。WebSocketpp 底层使用了 C++ 的 iostream 库和基于 Boo

fdsafwagdagadg6576的专栏 3265

WebRTC笔记之十八:WebSocketPP

一.WebSocketPP简介 1.WebSocket WebSocket是HTML5 引入的新特性,它通常用 Web端,为构建实时全双工的Web应用提供方便。WebSocket是一个基于TCP的应用层协议,它复用了HTTP握手规范,通过HTTP来建立WebSockt通道,客户端和服务器端都可以通过这条通道主动发起请求,通道建立完成后是持久化的,因而 WebSocket有着“Web 的 TCP”之称。 协议的实现可以是多样化的,除了可以在前端开发的JavaScript中使用WebSocket之外,我们也

草上爬的博客 6207

websocketpp基本用法

websocketpp是一个基于C11标准开发的websocket c++框架,文档地址为https://docs.websocketpp.org/getting_started.html,源码地址为https://github.com/zaphoyd/websocketpp(经常打不开)。典型使用方法如下代码,额外应该加上多线程,在主线程中针对每个客户端管理其活跃时间,定期清理不活跃的客户端。...

canlynetsky的博客 7766

WebSocketpp库与Boost集成的C++ WebSocket开发套件

WebSocket是一种在单个TCP连接上进行全双工通信的协议,它提供了一种在客户端和服务器之间进行实时双向数据传输的方法。WebSocket协议最初由IETF标准化,并在RFC 6455中记录。它是为了克服HTTP轮询和长轮询机制中固有的高延迟问题而设计的。Boost库是一个功能强大的、跨平台的C++库集合,提供了一组广泛、经过高度测试和性能优化的代码库。它由社区维护,并且遵循严格的编程规范。Boost库在许多方面为C++开发者提供了便利,特别是在处理数据结构、函数式编程、并发编程、泛型编程等方面。

weixin_35797963的博客 1092

websocketpp服务端demo

本资源简单介绍websocket的使用,资源中使用websocketpp编写一个服务器,静态页面创建websocket客户端。服务端使用c++,页面端使用H5 + js。

WebSocket 通信与 WebSocketpp 库使用指南

WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,通过这个附加头信息完成握手过程并升级协议的过程。

qq_67582098的博客 1458

Vue3项目实战:CKEditor5富文本编辑器从安装到隐藏不需要的功能

本文详细介绍了在Vue3项目中集成并深度定制CKEditor5富文本编辑器的完整流程。通过分析其模块化架构,指导开发者从标准构建出发,移除图片、表格等冗余插件,创建专属轻量构建,从而显著减小打包体积并提升用户体验。文章结合实战代码,涵盖了环境搭建、自定义构建配置、高级优化技巧等关键步骤。

weixin_29016833的博客 283

C++ 网络通信实践:cpp-httplib 与 websocketpp 入门指南,轻松实现 HTTP 与 WebSocket 交互

本文介绍 cpp - httplib 和 websocketpp 两个 C++ 库。前者轻量易用,支持 HTTP/HTTPS 客户端和服务端,适用于多种场景;后者遵循 RFC 6455,实现 WebSocket 全双工通信,帮助实现实时应用开发。

羑悻的博客. 3万+

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份IEC61850通信协议从理论到实践的完整测试验证实战指南。针对MMS、GOOSE、SV三大核心协议,详细阐述了测试环境搭建、自动化脚本编写、性能与异常测试方法,并分享了常见避坑经验,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备在现场的互联互通与稳定可靠运行。

neovim7hacker的博客 156

别再被网站风控了!手把手教你修改Chromium源码,实现TLS指纹随机化

本文详细介绍了如何通过修改Chromium源码实现TLS指纹随机化,有效规避网站风控。文章深入解析了TLS指纹(如JA3指纹)的工作原理,并提供了具体的源码修改步骤和编译方法,帮助开发者突破高级反爬技术。通过动态打乱加密套件顺序,实现每次请求生成不同的指纹,显著提升自动化工具的隐蔽性。

weixin_28712661的博客 427

【C++库】cpp-httplib与 websocketpp 安装及使用

本文介绍了 C++ 的两个网络库:cpp-httplib 和 WebSocketpp。cpp-httplib 是一个轻量级的 HTTP/HTTPS 客户端和服务器库,支持同步和异步操作,易于使用。WebSocketpp 是一个实现 WebSocket 协议的 C++ 库,支持 HTTP/HTTPS 和 WS/WSS,适用于实时通信场景。

You build it, you run it 2466

恶意代码实验3:Word宏病毒实验

只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。回答不正确三次,即可自动跳出病毒程序,但那时已经出现几十个文档。1、打开的宏编辑器如图所示,即可编写病毒代码。

qq_63949327的博客 6505

C++ websocket库 websocketpp/websocket++例子编译试用

转自https://blog.youkuaiyun.com/sdsabc2000/article/details/52461181 想试试C++的websocket,搜了下,发现websocketpp/websocket++用的人挺多,对主流浏览器都支持; 使用也方便,包含头文件即可(再加上boost头文件和库),没有其他依赖 1、搭建好boost http://blog.youkuaiyun.com/sdsabc200...

NBA_1的博客 7481

实战解析:如何用Python逆向破解FastMoss的TikTok数据加密签名(附完整代码)

本文详细解析了如何用Python逆向破解FastMoss平台的TikTok数据加密签名机制,包括MD5加密算法和JS逆向分析。通过完整的Python代码示例,帮助开发者理解签名生成原理并实现自动化请求,提升数据获取能力。

weixin_30955617的博客 558

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2681

【c++中间件】WebSocket介绍 && WebSocketpp库的使用

WebSocket是一种支持双向通信的HTML5协议,通过HTTP升级实现,解决了传统HTTP轮询的实时性问题。其特点包括轻量数据格式、跨域通信、支持文本和二进制传输等。WebSocketpp是一个跨平台C++库,实现了WebSocket协议,提供事件驱动接口和灵活依赖管理,适用于构建HTTP/WebSocket服务器。安装方法简单,使用apt-get安装相关依赖即可验证是否成功。该库支持多种网络协议和平台,适合开发实时通信应用。

lirendada的博客 1720

ATECC508A芯片开发笔记(三):获取508A串号、随机数源码及I2C抓包分析

ATECC508A芯片开发笔记(三):读取508A串号、获取随机数源码及I2C抓包分析 APP层函数编写及源码分析 At508_GetSernum() GetSernum抓包记录 At508_GetRandom( ) GetRandom抓包记录 经过前两章节,CryptoAuthlib库已经成功适配在代码中了,下面简单测试一下API函数,并分析下I2C通讯流程: APP层函数编写及源码分析利用li

HowieXue 薛永浩的博客 2万+

websocketpp库使用:快速搭建一个websocket服务端

在需要实时更新数据的场景下,如在线聊天、实时股票行情显示等,客户端为了获取最新信息,不得不频繁地向服务器发送请求,这种方式会造成大量不必要的网络流量和服务器负载,同时也无法保证数据的实时性。常见的操作码包括 0x0(延续帧)、0x1(文本帧)、0x2(二进制帧)、0x8(关闭帧)、0x9(Ping 帧)和 0xA(Pong 帧)。服务器收到客户端的升级请求后,如果同意升级,会返回一个状态码为 101 的响应,并包含相应的报头信息。客户端发送的帧必须进行掩码处理,服务器发送的帧不能进行掩码处理。

W2155的博客 1279

华为面试手撕真题【求1-n的最小公倍数】

求1-n的最小公倍数

MISAYAONE的博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

websocketpp/websocket++库教程/服务端代码封装

websocketpp这个库是开源的,我在项目中引用,感觉还是把代码开源出来给需要的人比较好。我自己对这个库进行了简单的封装,可以做出动态库或者so库,使用起来也方便。我只提供封装后的代码,至于websocket库的编译和项目配置需要自己去做。 web_sock_server.h头文件 #pragma once #include "pch.h" #include <string> #include <boost/thread.hpp> #include <boost/fu

hacker_lpy的博客 5956

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++ websocket服务器与客户端库websocketpp

https://my.oschina.net/u/4299887/blog/4255393 https://github.com/zaphoyd/websocketpp https://www.cnblogs.com/MakeView660/p/12780772.html websocketpp官方非官方翻译指南(上 http://www.esstudio.cn/?thread-26.htm windows下搭建websocketpp开发环境以及前端处理二进制流 https://bl..

sun007700的专栏 1056

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

websocketpp使用

本篇文章是对Websocketpp基本使用的讲解,希望在日常开发中帮助到大家和本人。

Yu_Lijing的博客 958

websocketpp 全面使用教程:C++ WebSocket 开发核心

WebSocket协议解决了HTTP短连接单向通信的痛点,实现了客户端与服务端的全双工长连接通信。该协议通过一次HTTP升级握手建立TCP长连接,之后双方可自由收发消息,无需重复建立连接。WebSocket++是一个基于C++11的跨平台WebSocket库,支持服务端/客户端双模式,内置异步I/O、心跳检测、TLS加密等功能。开发者只需定义回调函数处理连接事件和消息收发,无需关心底层协议细节,即可快速实现实时通信功能。该库兼容RFC6455标准,能与浏览器、移动端及其他语言的后端无缝互通,是开发即时通讯、

Small_entreprene的博客 1844

嵌入式开发—C++使用websocketpp 创建WebSocket服务器,并向浏览器发送图片

嵌入式开发—C++使用websocketpp 创建WebSocket服务器,并向浏览器发送图片 简单实现demo

weixin_46999174的博客 2917
上一篇: httpd-2.4.43编译和移植到arm
下一篇: 基于websocketpp实现简单websocket客户端
-逐鹿中原
博客等级 码龄9年 44粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值