C++ | websocketpp ws转wss

因为之前请求的ws接口会有连接不上的情况,所以需要把ws改成wss。经过两天的研究,终于搞清楚了ws与wss的区别。

一、概念

wss是 Web Socket Secure 的简称,它是 WebSocket 的加密版本。我们知道 WebSocket 中的数据是不加密的,但是不加密的数据很容易被别有用心的人窃取,因此为了保护数据安全,人们将 WebSocket 与 SSL结合,实现了安全的 WebSocket 通信,即 WebSocketSecure 。所以说 WSS 是使用 SSL 进行加密了的 WebSocket 通信技术。

二、引入

ws使用的头文件为websocketpp/config/asio_no_tls_client.hpp。

wss使用的头文件为websocketpp/config/asio_client.hpp,但是,我们翻看websocketpp/config/asio_client.hpp的源码,可以发现websocketpp/config/asio_client.hpp里面包含着websocketpp/config/asio_no_tls_client.hpp,所以,我们既要满足wss,又要满足ws的话,只需要#include <websocketpp/config/asio_client.hpp>与#include <websocketpp/client.hpp>即可,也就是说不需要#include <websocketpp/config/asio_no_tls_client.hpp>。

 三、依赖库配置

1.boost库:https://dl.bintray.com/boostorg/release/1.67.0/binaries/,根据需求确定下载x86还是x64,下载后安装(本人使用,如下图)

2.openssl:https://slproweb.com/products/Win32OpenSSL.html,下载后安装(本人使用,如下图)

3.websocketpp:https://github.com/zaphoyd/websocketpp (master)

4.VC++项目配置情况如下:(也可将这些库复制到项目工程目录,注意websocketpp必然是要配置的,下面截图中红框只是boost与openssl的配置)

四、代码

1.支持wss要用的类:websocketpp::config::asio_tls_client,支持ws要用的类websocketpp::config::asio_client

2.支持wss,需要在调用get_connection()之前,set_tls_init_handler()。

#include <stdio.h>
#include <string.h>
#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>
#include <iostream>
#include "common.h"
typedef websocketpp::client<websocketpp::config::asio_tls_client> client_tls;
typedef websocketpp::client<websocketpp::config::asio_client> client_no_tls;
typedef websocketpp::lib::shared_ptr<websocketpp::lib::asio::ssl::context> context_ptr;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
typedef websocketpp::config::asio_client::message_type::ptr message_ptr;

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);
    return ctx;
}


void on_message(websocketpp::connection_hdl hdl, message_ptr msg) {

    std::cout << "on_message" << hdl.lock().get()<< " and message: " << msg->get_payload()<< std::endl;
}

void on_open(void* c, websocketpp::connection_hdl hdl, bool tls) {

    std::cout << "on_open" << std::endl;
    std::string first_data = "{ \"assess_ref\":{\"core_type\":\"cn.multirec.score\",\"grade_tight\" : 0,\"rank\" : 100,\"scale\" : 1.0,\"support_repeat\" : false,\"text\" : \"小小\"},\"control_param\" : {\"suffix_penal_quick\":1,\"vad_max_sec\" : 30,\"vad_pause_sec\" : 5,\"vad_st_sil_sec\" : 5},\"mime_type\" : \"wav\",\"need_url\" : false,\"user_info\" : \"user_info\" }";
    //发送数据
    if (tls)
    {
        ((client_tls*)c)->send(hdl, first_data, websocketpp::frame::opcode::text);
    }
    else {
        ((client_no_tls*)c)->send(hdl, first_data, websocketpp::frame::opcode::text);
    }

}
int main(int argc, char* argv[]) {

    // Create a client endpoint
    client_tls _client_tls;
    client_no_tls  _client_no_tls;
    std::string hostname = "openai.100tal.com";

    std::string uri = "wss://openai.100tal.com/****************";
    char ch= uri.c_str()[2];
    bool tls = (ch == 's');
    try {

        if (tls)//wss
        {
            _client_tls.clear_access_channels(websocketpp::log::alevel::all);
            _client_tls.clear_error_channels(websocketpp::log::elevel::all);

            _client_tls.init_asio();
            _client_tls.set_reuse_addr(true);
            _client_tls.set_message_handler(bind(&on_message,  ::_1, ::_2));
            _client_tls.set_open_handler(bind(&on_open, &_client_tls, ::_1,true));
            _client_tls.set_tls_init_handler(bind(&on_tls_init, hostname.c_str(), ::_1));
            websocketpp::lib::error_code ec;
            client_tls::connection_ptr con = _client_tls.get_connection(uri, ec);

            if (ec) {
                std::cout << "could not create connection because: " << ec.message() << std::endl;
                return 0;
            }
            _client_tls.connect(con);
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
            _client_tls.run();

        }
        else {//ws
            _client_no_tls.clear_access_channels(websocketpp::log::alevel::all);
            _client_no_tls.clear_error_channels(websocketpp::log::elevel::all);

            _client_no_tls.init_asio();
            _client_no_tls.set_reuse_addr(true);
            _client_no_tls.set_message_handler(bind(&on_message, ::_1, ::_2));
            _client_no_tls.set_open_handler(bind(&on_open, &_client_no_tls, ::_1, false));
            websocketpp::lib::error_code ec;
            client_no_tls::connection_ptr con = _client_no_tls.get_connection(uri, ec);

            if (ec) {
                std::cout << "could not create connection because: " << ec.message() << std::endl;
                return 0;
            }
            std::cout << "to connect... " << std::endl;
            _client_no_tls.connect(con);
           
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
            _client_no_tls.run();
        }
       
    }

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

}

 

 

 

 

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
在Nginx中配置WSS,你可以使用以下配置: ``` server { listen 443 ssl; server_name im-wss-api.xxx.xxx; ssl_certificate ../cert/server.crt; ssl_certificate_key ../cert/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:8088; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } } ``` 这个配置中,使用了监听443端口,并使用SSL证书进行加密通信。同时,配置了代理发到本地的8088端口,以实现WSS功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【高效运维】Nginx下配置WSWSS](https://blog.csdn.net/u012069313/article/details/124562355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Nginx配置WSWSS域名](https://blog.csdn.net/cljdsc/article/details/128056559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [系统基于springboot框架,使用Java+vue编写,为前后端分离的微服务项目](https://download.csdn.net/download/Abelon/88250447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值