websocketpp上手笔记-Windows安装

news2024/11/28 14:50:20

WebSocketpp是什么

最近手上有一个c++项目,需要用websocket从服务器端收内容。于是网上找了圈,发现WebSocketpp库可以做websocket的客户端。

WebSocketpp也叫WebSocket++,github地址是:https://github.com/zaphoyd/websocketpp,6.7k Stars。最新版本0.8.2.

话不多少,先把代码从github上拉下来。查看README,找到UserManual,进入Getting Started。文档中如此描述:

WebSocket++ is a header only library. You can start using it by including the websocketpp source directory in your project's include path and including the appropriate WebSocket++ headers in your program. You may also need to include and/or link to appropriate Boost/system libraries. 

WebSocket++ includes cmake and scons scripts for building the examples and unit tests.

WebSocket++是一个只需要头文件的库,直接包含在到工程中就可以使用了。但是呢,还需要Boost库。

WebSocket++包含了cmake脚本来编译examples和unit tests。

我的目标就是编译成功examples和unit tests。

 查看WebSocketpp的CMakeLists.txt

WebSocketpp支持cmake脚本呢编译examples和tests。于是先查看CMakeLists.txt。迅速看到了依赖内容Dependencies,里面明确提到了要依赖Boost库。由于我之前没有使用过boost库,所以得先安装boost库。

由于我的程序同事支持Windows和Linux,所以两个平台都要安装。

安装Boost

首先从官网https://www.boost.org/users/download/下载boost源码。我没有想太多,直接下载的最新版本1.84.0,直觉感觉WebSocketpp未必能支持这么新的版本。先硬着头皮试试,不行再换低版本。

进入到boost源码目录,打开vs2019的命令行,先执行:

bootstrap.bat

执行完成之后,会生成一个b2.exe的可执行文件。接着执行:

.\b2 variant=debug link=static threading=multi runtime-link=static

参数含义:

  • variant=debug   编译Debug
  • link=static   静态库
  • threading=multi支持多线程
  • runtime-link=static  静态连接

也就是我要编译一个使用MTD运行库的debug版本的静态库。没有指定编译目录,默认本文件夹。

编译完成之后输出:

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

    E:\boost_1_84_0

The following directory should be added to linker library paths:

    E:\boost_1_84_0\stage\lib

先试试debug版本能不能用,如果可以,后续再编译Release版本。

尝试WebSocket++能否连接Boost(Debug)

再次进入WebSocket++的CMakeLists.txt文件,找到加载Boost的部分:

    set (Boost_ADDITIONAL_VERSIONS "1.39.0" "1.40.0" "1.41.0" "1.42.0" "1.43.0" "1.44.0" "1.46.1") # todo: someone who knows better spesify these!

    find_package (Boost 1.39.0 COMPONENTS "${WEBSOCKETPP_BOOST_LIBS}")

    if (Boost_FOUND)
        # Boost is a project wide global dependency.
        include_directories (${Boost_INCLUDE_DIRS})
        link_directories (${Boost_LIBRARY_DIRS})

        # Pretty print status
        message (STATUS "-- Include Directories")
        foreach (include_dir ${Boost_INCLUDE_DIRS})
            message (STATUS "       " ${include_dir})
        endforeach ()
        message (STATUS "-- Library Directories")
        foreach (library_dir ${Boost_LIBRARY_DIRS})
            message (STATUS "       " ${library_dir})
        endforeach ()
        message (STATUS "-- Libraries")
        foreach (boost_lib ${Boost_LIBRARIES})
            message (STATUS "       " ${boost_lib})
        endforeach ()
        message ("")
    else ()
        message (FATAL_ERROR "Failed to find required dependency: boost")
    endif ()

把Boost的版本号修改为:1.84.0

 set (Boost_ADDITIONAL_VERSIONS "1.84.0" "1.39.0" "1.40.0" "1.41.0" "1.42.0" "1.43.0" "1.44.0" "1.46.1") # todo: someone who knows better spesify these!

 find_package (Boost 1.84.0 COMPONENTS "${WEBSOCKETPP_BOOST_LIBS}")

开始生成,首先在WebSocket++根目录下创建一个build目录,进入build目录,执行:

cmake .. -DBUILD_EXAMPLES=TRUE -DBUILD_TESTS=TRUE  -DBOOST_ROOT=E:\boost_1_84_0 -DCMAKE_BUILD_TYPE=debug

执行失败,找不到Boost:

e:\websocketpp-master\build>cmake .. -DBUILD_EXAMPLES=TRUE -DBUILD_TESTS=TRUE  -DBOOST_ROOT=E:\boost_1_84_0 -DCMAKE_BUILD_TYPE=debug
-- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.18362.
* Configuring Boost
-- -- Using BOOST_ROOT
--        E:\boost_1_84_0
CMake Warning at C:/Program Files/CMake/share/cmake-3.20/Modules/FindBoost.cmake:1354 (message):
  New Boost version may have incorrect or missing dependencies and imported
  targets
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.20/Modules/FindBoost.cmake:1476 (_Boost_COMPONENT_DEPENDENCIES)
  C:/Program Files/CMake/share/cmake-3.20/Modules/FindBoost.cmake:2086 (_Boost_MISSING_DEPENDENCIES)
  CMakeLists.txt:218 (find_package)

从网上搜索错误信息“New Boost version may have incorrect or missing dependencies and imported targets”。原因是cmake版本比boost版本旧,如果想使用特定版本的boost,就得使用在该boost发布后发布的cmake版本。

详见:https://stackoverflow.com/questions/65560775/cmake-new-boost-version-may-have-incorrect-or-missing-dependencies-and-importe 我的cmake版本是3.20.3,查看FindBoost.cmake的1354行:

if(Boost_VERSION_STRING VERSION_GREATER_EQUAL 1.77.0 AND NOT Boost_NO_WARN_NEW_VERSIONS)
    message(WARNING "New Boost version may have incorrect or missing dependencies and imported targets")
endif()

可以看到该版本的cmake最多支持1.77.0的Boost。不打算安装新版本的cmake,我本来就怀疑WebSocket++不支持Boost1.84.0,趁此机会使用一个确定可用的版本。在github上的Issues上https://github.com/zaphoyd/websocketpp/issues/912,作者回复到:

0.8.2 has been tested through Boost 1.72

所以,也不折腾Boost版本了,下载Boost1.72,重新生成vs工程。这次生成工程成功。然后使用vs2019打开工程,分别编译examples里面的echo_client和echo_server,编译时把运行库改为MTD,与Boost库保持一致。编译成功。

同时启动echo_client和echo_server,也成功,可以运行。

TODO:这里有一个疑问,只指定了boost库的路径,并没有设置要链接哪些boost库,vs是怎么链接到正确的库呢?

SSL

首先,在编译examples的是没有链接openssl的,肯定不支持的。但是,我决定先从代码层面上支持SSL。在CMakeLists中,是使用find_package加载openssl的,但是我电脑上没有没有openssl的cmake module。不过我有已经编译好的open ssl 静态库。于是把静态库copy到WebSocketPP文件夹中。然后手动修改了一下CMakeList.txt:

	#原来是用find_package来设置openssl的,现在改成手动添加OpenSSL的路径
    #find_package(OpenSSL)   
    set(OPENSSL_SSL_LIBRARY "libssl.lib")
	set(OPENSSL_CRYPTO_LIBRARY "libcrypto.lib")
	set(OPENSSL_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/openssl/include")	
	#添加openssl路径
	link_directories(${PROJECT_SOURCE_DIR}/openssl/win64_static)
	
	#设置变量OpenSSL_FOUND,后续会根据该标志来创建TLS的工程
	set(OPENSSL_FOUND ON)

然后重新cmake生成工程,可以看到,生成了print_client_tls。编译成功。在运行之前,我先看了一下大致的逻辑。print_client_tls默认的连接地址是echo_server_tls的地址。echo_server_tls默认使用的一个自签署的证书,print_client_tls使用提前生成的pem文件来验证。

但是,我想用一个有效的网址,采用根证书验证。于是,我把地址改为了:wss://echo.websocket.org。验证部分的代码也要做相应的调整:

void add_windows_root_certs(context_ptr ctx)
{    
    HCERTSTORE hStore = CertOpenSystemStoreA(0, "ROOT");
    if (hStore == NULL) {
        return;
    }

    X509_STORE* store = X509_STORE_new();
    PCCERT_CONTEXT pContext = NULL;
    while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != NULL) {
        X509* x509 = d2i_X509(NULL,
            (const unsigned char**)&pContext->pbCertEncoded,
            pContext->cbCertEncoded);
        if (x509 != NULL) {
            X509_STORE_add_cert(store, x509);
            X509_free(x509);
        }
    }

    CertFreeCertificateContext(pContext);
    CertCloseStore(hStore, 0);

    SSL_CTX_set_cert_store(ctx->native_handle(), store);
}

context_ptr on_tls_init(const char * hostname, websocketpp::connection_hdl) {
    context_ptr ctx = websocketpp::lib::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);

    try {
        ctx->set_options(boost::asio::ssl::context::default_workarounds |
                         boost::asio::ssl::context::no_sslv2 |
                         boost::asio::ssl::context::no_sslv3 |
                         boost::asio::ssl::context::single_dh_use);
  
       
        ctx->set_verify_mode(boost::asio::ssl::verify_peer);
        //设置verify_none就不要验证服务端,也不需要加载证书
        //ctx->set_verify_mode(boost::asio::ssl::verify_none);
        //ctx->set_verify_callback(bind(&verify_certificate, hostname, ::_1, ::_2));
        ctx->set_verify_callback(bind(&verify_certificate, "hostname", ::_1, ::_2));
   
 #ifndef _WIN32
           //这个方法在windows上不起作用
        ctx->set_default_verify_paths();
#else
        //加载系统的根证书链
        add_windows_root_certs(ctx);
#endif

        // 这个方法可以显示添加某个pem证书文件
        //ctx->load_verify_file("");
    } catch (std::exception& e) {
        std::cout << e.what() << std::endl;
    }
    return ctx;
}

运行成功。

TODO:open ssl 静态库没有debug版本,使用MT运行库,为什么可以和使用MTD运行库的examples一起编译?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天五分钟深度学习:神经网络和深度学习有什么样的关系?

本文重点 神经网络是一种模拟人脑神经元连接方式的计算模型&#xff0c;通过大量神经元之间的连接和权重调整&#xff0c;实现对输入数据的处理和分析。而深度学习则是神经网络的一种特殊形式&#xff0c;它通过构建深层次的神经网络结构&#xff0c;实现对复杂数据的深度学习…

商标名称的词性:因形近不良而驳回!

近期看到业内有许多因不良驳回的案例&#xff0c;有些是直接因为不良而驳回&#xff0c;普推知产老杨发现一个因形近而驳回的案例&#xff0c;2022年5月申请的“乡巴佬”通过初审下证了&#xff0c;2022年10月申请“乡巴饶”因形近“乡巴佬”不良而驳回&#xff0c;而且还做过驳…

打造安全医疗网络:三网整体规划与云数据中心构建策略

医院网络安全问题涉及到医院日常管理多个方面&#xff0c;一旦医院信息管理系统在正常运行过程中受到外部恶意攻击&#xff0c;或者出现意外中断等情况&#xff0c;都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等&#xff0c;…

Word、Excel、PPT文件转PDF文件(C#)

一、添加依赖 为wpf项目引用Microsoft.Office.Interop.Excel、Microsoft.Office.Interop.PowerPoint、Microsoft.Office.Interop.Word、Office&#xff0c;依赖文件已经打到源代码包里了。 二、先定义一些命名空间 using Word Microsoft.Office.Interop.Word;using Excel M…

Vue2.x安装Tinymce依赖冲突解决

Vue2.x安装Tinymce依赖冲突原因 使用vue整合tinymce富文本编辑器&#xff0c;安装依赖时报错 报错的原因是下载版本与vue的版本对不上vue2.x版本应该使用如下指定版本依赖更合适 npm install --save "tinymce/tinymce-vue^3.1"额外依赖为 npm install --save &quo…

ssm013小型企业办公自动化系统的设计和开发+vue

小型企业办公自动化系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱&am…

流行的API架构学习

几种流行的API架构风格图 SOAP&#xff08;Simple Object Access Protocol&#xff09; 优点&#xff1a;SOAP 是一种基于 XML 的通信协议&#xff0c;具有良好的跨平台和跨语言支持。它提供了丰富的安全性和事务管理功能&#xff0c;并支持复杂的消息交换模式。 缺点&#xf…

远控桌面多任务并发文件保密传输

远程桌面文件传输是一个重要的功能&#xff0c;大多数远控都是用的桌面程序模式&#xff0c;利用系统自带复制粘贴拖拽文件拷贝功能&#xff0c;做一个ole调用对接&#xff0c;可以将很多控制权交给操作系统。 但我做的是浏览器版&#xff0c;浏览器是沙盒原理&#xff0c;为了…

mkcert生成ssl证书+nginx部署局域网内的https服务访问问题

文章目录 mkcert生成ssl证书nginx部署局域网内的https服务访问问题1、下载mkcert查看自己的电脑是arm还是amd架构 2、安装mkcert3、测试mkcert是否安装成功4、查看CA证书存放位置5、打开windows的证书控制台6、生成自签证书,可供局域网内使用其他主机访问以下是nginx部署https服…

代码随想录第27天 | 39. 组合总和、40.组合总和II、131.分割回文串

一、前言 今天的主题还是回溯算法&#xff0c;还是根据那个backtracking模板&#xff0c;但是今天会涉及到去重和一些小细节的问题。 二、组合总和 1、思路&#xff1a; 我一开始的想法就是在for循环转化为&#xff1a; for(int i 0; i < size; i) 但是这个是会陷入一…

【LDLTS】拉普拉斯深能级瞬态光谱

Laplace deep level transient spectroscopy&#xff08;拉普拉斯深能级瞬态光谱&#xff0c;简称LDLTS&#xff09;是一种用于分析和表征半导体材料中深层能级缺陷的技术。它是传统能级瞬态光谱&#xff08;DLTS&#xff09;方法的扩展和改进&#xff0c;特别适用于解决传统DL…

Kubernetes kafka系列 | Strimzi 部署kafka-bridge

Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件&#xff0c;用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台&#xff0c;广泛用于构建实时数据流水线和流式应用程序。然而…

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!

操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…

用kimichat批量识别出图片版PDF文件中的文字内容

图片版的PDF文件&#xff0c;怎么才能借助AI工具来提取其中全部的文字内容呢&#xff1f; 第一步&#xff1a;将PDF文件转换成图片格式 具体方法参见文章&#xff1a;《零代码编程&#xff1a;用kimichat将图片版PDF自动批量分割成多个图片》 第二步&#xff1a;识别图片中的…

Springboot之Actuator的渗透

1. env http://ip:8080/actuator/env GET 请求 /env 会直接泄露环境变量、内网地址、配置中的用户名等信息&#xff1b;当程序员的属性名命名不规范&#xff0c;例如 password 写成 psasword、pwd 时&#xff0c;会泄露密码明文&#xff1b; 2.heapdump Heapdump地址为http…

互联网轻量级框架整合之JavaEE基础II

编写本篇代码并实际执行之前请仔细阅读前一篇互联网轻量级框架整合之JavaEE基础I Servlet 在Servlet容器中&#xff0c;Servlet是最基础的组件&#xff0c;也可以把JSP当做Servlet&#xff0c;JSP的存在意义只在于方便编写动态页面&#xff0c;使Java语言能和HTML相互结合&…

深度学习-计算机视觉入门-part1

计算机视觉入门 文章目录 计算机视觉入门一、 从卷积到卷积神经网络1.图像的基本表示2. 卷积操作3.卷积遇见深度学习3.1 通过学习寻找卷积核3.2 参数共享&#xff1a;卷积带来参数量骤减3.3 稀疏交互&#xff1a;获取更深入的特征 二、手撕卷积代码三、经典CNN模型介绍四、CNN模…

爬取BOSS直聘招聘数据(详情页数据+__zp_stoken__逆向)

这里携带逆向方法进行请求 获得数据 需要逆向方法请私聊 , 下面部分只展示爬取思路 对网页进行分析抓包 设置参数 – 城市/薪资范围/职业 对网页进行请求获得数据集 利用xpath,soup等进行进行数据清洗 将数据一csv的格式保存

【面试八股总结】超文本传输协议HTTP(一)

一、 什么是HTTP协议&#xff1f; HTTP是超文本传输协议 HyperText Transfer Protocol 特性&#xff1a; 简单、灵活、易于扩展无状态&#xff1a;服务器不会记忆HTTP状态不安全&#xff1a;通信使用明文&#xff0c;不验证通信方身份&#xff0c;无法的证明报文的完整性&…

研发设计人员能力级别定义

研发设计人员能力&级别定义 1. 源由2. 级别定义3. 级别能力3.1 助理工程师3.1.1 工作内容3.1.2 级别晋升3.1.3 详细描述 3.2 初级工程师3.2.1 工作内容3.2.2 级别晋升3.2.3 详细描述 3.3 高级工程师3.3.1 工作内容3.3.2 级别晋升3.3.3 详细描述 3.4 资深工程师3.4.1 工作内…