C++之socket.io编译使用

1. 什么是socket.io

  • Socket.IO 实现了实时双向的基于事件的通讯机制。旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制。

2. 开发环境配置

socket.io的编译需要安装如下依赖环境

  • cmake
  • rapidjson
  • boost
  • websocketpp

2.1 获取socket.io的源码

  • git clone https://github.com/socketio/socket.io-client-cpp.git

2.2 cmake安装

  • sudo apt-get install cmake

2.3 boost安装

2.3.1 获取源码
  • https://sourceforge.net/projects/boost/files/boost/ 把源码下载下来(boost_1_74_0.tar.bz2)
2.3.2 解压编译下载
  • tar -xvf boost_1_74_0.tar.bz2
  • cd boost_1_74_0/
  • ./bootstrap.sh
  • ./b2

2.4 rapidjson下载

socket.io的源码的目录结构如下:
├── API.md
├── boost_1_74_0.tar.bz2
├── BOOST.md
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── CMakeLists.txt
├── examples
├── INSTALL_IOS.md
├── INSTALL.md
├── lib
├── libsioclient.a
├── libsioclient_tls.a
├── LICENSE
├── Makefile
├── README.md
├── src
└── test

cd lib
.
├── rapidjson
└── websocketpp

把下载下来的源码放在rapidjson中

git clone https://github.com/Tencent/rapidjson.git

2.5 websocketpp下载

  • 和rapidjson下载同理进入把websocketpp下载的内容放到websocketapp中
  • git clone https://github.com/zaphoyd/websocketpp.git
最后lib中的目录结构如下:
├── rapidjson
│   ├── appveyor.yml
│   ├── bin
│   ├── CHANGELOG.md
│   ├── CMakeLists.txt
│   ├── CMakeModules
│   ├── contrib
│   ├── doc
│   ├── docker
│   ├── example
│   ├── include
│   ├── include_dirs.js
│   ├── library.json
│   ├── license.txt
│   ├── package.json
│   ├── rapidjson.autopkg
│   ├── RapidJSONConfig.cmake.in
│   ├── RapidJSONConfigVersion.cmake.in
│   ├── RapidJSON.pc.in
│   ├── readme.md
│   ├── readme.zh-cn.md
│   ├── test
│   ├── thirdparty
│   └── travis-doxygen.sh
└── websocketpp
    ├── changelog.md
    ├── cmake
    ├── CMakeLists.txt
    ├── COPYING
    ├── docs
    ├── Doxyfile
    ├── examples
    ├── readme.md
    ├── roadmap.md
    ├── SConstruct
    ├── test
    ├── tutorials
    ├── websocketpp
    └── websocketpp-config.cmake.in

2.6 编译socket.io

cmake -DBOOST_ROOT:STRING=/home/fzj/socketio/boost_1_74_0(boost安装的位置)  -DBOOST_VER:STRING=1.74.0(boost版本) .

make

make install

最后会生成build,里面有
├── include(静态库对应的头文件)
│   ├── sio_client.h
│   ├── sio_message.h
│   └── sio_socket.h
└── lib(socket.io的静态库)
    └── Release
        ├── libboost_date_time.a
        ├── libboost_random.a
        ├── libboost_system.a
        ├── libsioclient.a
        └── libsioclient_tls.a

3. socket.io测试

3.1 建立测试程序

//把上面编译出来的头文件拉倒当前测试程序的文件夹中

#include <iostream>
#include "sio_client.h"
#include "sio_socket.h"
#include "string.h"

using namespace std;
using namespace sio;


int main()
{

    sio::client h;
    std::string nickName = "123"

    h.connect("https://域名:端口");
    h.socket()->emit("readyToStream", nickName);

    cout << "Hello, world!" << endl;
    return 0;
}

g++ sockiotest.cpp  -o test /home/fzj/socketio/socket.io-client-cpp/build/lib/Release/libsioclient.a -lpthread  
[2020-09-24 02:15:11] [connect] Successful connection
[2020-09-24 02:15:11] [error] handle_read_http_response error: websocketpp.transport:7 (End of File)

编译后出现该情况,经上网查询后,发现这个问题是TLS的问题,如果是https建议我们使用libsioclient_tls.a这个库,使用这个库确保你虚拟机上安装有openssl。(经常测试无论http还是https还是一样的效果)

更改使用libsioclient_tls.a这个库后会报另外的错误
g++ sockiotest.cpp  -o test /home/fzj/socketio/socket.io-client-cpp/build/lib/Release/libsioclient_tls.a -lpthread  -lm -lssl -lcrypto

[2020-09-24 02:10:39] [connect] Successful connection
[2020-09-24 02:10:39] [error] handle_transport_init received error: TLS handshake failed
[2020-09-24 02:10:39] [info] asio async_shutdown error: asio.ssl:336462231 (shutdown while in init)

经过3个小时的尝试和不断的努力,终于找到了答案,原始是TLS的版本问题,客户端和服务端不同
于是修改socket.io的源码

1. 找到sio_client_impl.cpp原文件(/src/internal/sio_client_impl.cpp)
2. 打开文件/src/internal/sio_client_impl.cpp
3. 找到源码如下位置
#if SIO_TLS
    client_impl::context_ptr client_impl::on_tls_init(connection_hdl conn)
    {
        //!更改boost :: asio :: ssl :: context :: tlsv1 -----> boost :: asio :: ssl :: context :: tlsv12
        context_ptr ctx = context_ptr(new  boost::asio::ssl::context(boost::asio::ssl::context::tlsv1));
        boost::system::error_code ec;
        ctx->set_options(boost::asio::ssl::context::default_workarounds |
                             boost::asio::ssl::context::no_sslv2 |
                             boost::asio::ssl::context::single_dh_use,ec);
        if(ec)
        {
            cerr<<"Init tls failed,reason:"<< ec.message()<<endl;
        }
        
        return ctx;
    }
#endif
4. 保存文件重新编译安装,参照2.6 编译socket.io
5. 重新测试,测试成功,已经完成连接
[2020-09-24 02:56:13] [connect] Successful connection
[2020-09-24 02:56:13] [connect] WebSocket Connection 129.204.161.74:8091 v-2 "WebSocket++/0.8.2" /socket.io/?EIO=4&transport=websocket&t=1600941373 101

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是一个简单的 C++ Crow Asio 应用程序示例,它基于异步 IO 编写,并使用 Boost 库进行编译: ```c++ #include "crow_all.h" #include <boost/asio.hpp> #include <memory> int main() { // 创建一个 io_context 对象 auto io = std::make_shared<boost::asio::io_context>(); // 创建一个 Crow 应用程序对象,并将 io_context 对象传递给它 crow::SimpleApp app; CROW_ROUTE(app, "/")([](){ return "Hello, World!"; }); // 创建一个 TCP 服务器对象,并将应用程序对象和 io_context 对象传递给它 boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 8080); boost::asio::ip::tcp::acceptor acceptor(*io, endpoint); acceptor.listen(); // 开始监听客户端请求,并启动 io_context 对象的事件循环 boost::asio::spawn(acceptor.get_executor(), [&](boost::asio::yield_context yield){ while(true){ boost::system::error_code ec; boost::asio::ip::tcp::socket socket(*io); acceptor.async_accept(socket, yield[ec]); if(!ec){ boost::asio::spawn(socket.get_executor(), [&](boost::asio::yield_context yield){ try{ // 处理客户端请求 auto conn = std::make_shared<crow::Connection>(app, std::move(socket)); conn->start(); }catch(const std::exception& e){ std::cerr << "Exception in connection: " << e.what() << std::endl; } }); } } }); // 启动应用程序的主循环 app.port(8080).run(); // 启动 io_context 对象的事件循环 io->run(); return 0; } ``` 这个程序创建了一个简单的 Crow 应用程序,监听 8080 端口,并在客户端请求时返回 "Hello, World!"。其中 `boost::asio::spawn()` 方法用于在异步 IO 模式下处理客户端请求,同时启动了 `io_context` 对象的事件循环。在程序运行时,需要在终端中使用编译器和 Boost 库进行编译,并执行编译后的可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GeekFong

记录不易,坚持更新

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

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

打赏作者

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

抵扣说明:

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

余额充值