目录
- 编译信息
- 说明
- 引入websocketpp环境
- 引入asio环境
- 编译验证
编译信息
作者:xzf
创建时间:2021/10/29
更新时间:2021/10/29
说明
本文主要说明,基于 Windows 下,使用 websocketpp, 构造 socket 服务器,且主要针对说明websocketpp 的引入,和引入 asio(独立于boost).
环境:Microsoft Windows 10 家庭中文版
工具:Cmake 3.20.5版本
引入websocketpp环境(862kb)
- 进入 websocketpp 的 gitbub 地址https://github.com/zaphoyd/websocketpp
- 通过 git clone 把源码下载或者下载zip包。
- 进入 websocketpp 文件夹内,新建 build文件夹。
- 使用 Cmake 软件开始编译。(根据常规的 Cmake 流程就好。参考http://qchenmo.com/typecho/build/index.php/2021/10/09/48.html)
- 可以修改输出的地址: CMake_INSTALL_PREFIX ,指定输出路径,但不要改动其他,特别是 BUILD_EXAMPLES 和 BUILD_TESTS 不要打钩,由于不适用 boost ,但是建立这个两个都需要用到 boost 所以不能打钩。
- 如果修改了,再点击一次 “Configure” ,如果没有修改直接点击 “Generate”。
- 进入 build 文件夹,打开 websocketpp.sln
- 选择项目“INSTALL”构建生成。
- 在原目录下,会多出 install,这个里面就包含了编译好的 websocket .如果第5.步,修改了地址,在所需要的文件里找就好。
- install 有两个文件,cmake 和 include ,我们需要的是 include。
- websocket 打包的是 hpp,所以不需要静态库或动态库,跟引入头文件一样引入就好。
引入asio环境(5.60MB)
- 进入asio官网https://think-async.com/Asio,本文使用的版本是1.20.0
- 点击 “Download”
- 选择 “asio-1.20.0.zip”(独立于boost,不依赖于boost)。
- 解压后,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;
}
}