学习websocketpp并独立使用aosi不使用boost

目录

  • 编译信息
  • 说明
  • 引入websocketpp环境
  • 引入asio环境
  • 编译验证

编译信息

作者:xzf

创建时间:2021/10/29

更新时间:2021/10/29

说明

本文主要说明,基于 Windows 下,使用 websocketpp, 构造 socket 服务器,且主要针对说明websocketpp 的引入,和引入 asio(独立于boost).

环境:Microsoft Windows 10 家庭中文版

工具:Cmake 3.20.5版本

引入websocketpp环境(862kb)

  1. 进入 websocketpp 的 gitbub 地址https://github.com/zaphoyd/websocketpp
  2. 通过 git clone 把源码下载或者下载zip包。
  3. 进入 websocketpp 文件夹内,新建 build文件夹。
  4. 使用 Cmake 软件开始编译。(根据常规的 Cmake 流程就好。参考http://qchenmo.com/typecho/build/index.php/2021/10/09/48.html
  5. 可以修改输出的地址: CMake_INSTALL_PREFIX ,指定输出路径,但不要改动其他,特别是 BUILD_EXAMPLESBUILD_TESTS 不要打钩,由于不适用 boost ,但是建立这个两个都需要用到 boost 所以不能打钩。
  6. 如果修改了,再点击一次 “Configure” ,如果没有修改直接点击 “Generate”
  7. 进入 build 文件夹,打开 websocketpp.sln
  8. 选择项目“INSTALL”构建生成。
  9. 在原目录下,会多出 install,这个里面就包含了编译好的 websocket .如果第5.步,修改了地址,在所需要的文件里找就好。
  10. install 有两个文件,cmake 和 include ,我们需要的是 include。
  11. websocket 打包的是 hpp,所以不需要静态库或动态库,跟引入头文件一样引入就好。

引入asio环境(5.60MB)

  1. 进入asio官网https://think-async.com/Asio,本文使用的版本是1.20.0
  2. 点击 “Download”
  3. 选择 “asio-1.20.0.zip”(独立于boost,不依赖于boost)。
  4. 解压后,include 就是所需要的环境,不需要编译。

编译验证

构造一个项目,引入websocketpp--examples--echo_server.cpp,记得引入刚刚两个include

//最重要的两个宏,不能写错
// 官网有解释https://think-async.com/Asio/asio-1.20.0/doc/asio/using.html
#define ASIO_STANDALONE
#define _WEBSOCKETPP_CPP11_INTERNAL_

#include <websocketpp/config/asio_no_tls.hpp>

#include <websocketpp/server.hpp>

#include <iostream>

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

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

// pull out the type of messages sent by our config
typedef server::message_ptr message_ptr;

// Define a callback to handle incoming messages
void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg) {
    std::cout << "on_message called with hdl: " << hdl.lock().get()
        << " and message: " << msg->get_payload()
        << std::endl;

    // check for a special command to instruct the server to stop listening so
    // it can be cleanly exited.
    if (msg->get_payload() == "stop-listening") {
        s->stop_listening();
        return;
    }

    try {
        s->send(hdl, msg->get_payload(), msg->get_opcode());
    }
    catch (websocketpp::exception const& e) {
        std::cout << "Echo failed because: "
            << "(" << e.what() << ")" << std::endl;
    }
}

int main() {
    // Create a server endpoint
    server echo_server;

    try {
        // Set logging settings
        echo_server.set_access_channels(websocketpp::log::alevel::all);
        echo_server.clear_access_channels(websocketpp::log::alevel::frame_payload);

        // Initialize Asio
        echo_server.init_asio();

        // Register our message handler
        echo_server.set_message_handler(bind(&on_message, &echo_server, ::_1, ::_2));

        // Listen on port 9002
        echo_server.listen(9002);

        // Start the server accept loop
        echo_server.start_accept();

        // Start the ASIO io_service run loop
        echo_server.run();
    }
    catch (websocketpp::exception const& e) {
        std::cout << e.what() << std::endl;
    }
    catch (...) {
        std::cout << "other exception" << std::endl;
    }
}
Edit with Markdown