Civetweb++
#0 环境
Ubuntu 16.04
cmake
- Civetweb Demo
- 针对
Ubuntu/macOS
环境下的C++ Web Server
开发, 结合Civetweb
+Baidu Apollo
, 这里单独封装了一个库(Typhoon)
#1 安装civetweb
git clone https://github.com/civetweb/civetweb.git
git checkout trunk
mkdir buildx && cd buildx
cmake -DCIVETWEB_ENABLE_CXX=ON -DBUILD_SHARED_LIBS=ON -DCIVETWEB_BUILD_TESTING=OFF -DCIVETWEB_ENABLE_WEBSOCKETS=ON ..
make
sudo make install
- BUILD_SHARED_LIBS: 动态链接库
更多开关可查看
src/CmakeLists.txt
文件
#2 demo
#2.1 cmakelists.txt
cmake_minimum_required(VERSION 3.17)
project(civetweb_demo)
set(TARGET_NAME ${PROJECT_NAME})
set(CMAKE_CXX_STANDARD 14)
find_package(PkgConfig REQUIRED)
find_package(civetweb REQUIRED)
find_package(Boost REQUIRED COMPONENTS system thread)
pkg_check_modules(NLOHMANNJSON REQUIRED nlohmann_json)
include_directories(
${Boost_INCLUDE_DIRS}
${NLOHMANNJSON_INCLUDE_DIRS}
${civetweb_INCLUDE_DIR}
)
link_directories (
${Boost_LIBRARY_DIRS}
${NLOHMANNJSON_LIBRARY_DIRS}
/usr/local/lib
)
aux_source_directory(src ENGINE_SOURCE_DIRS)
aux_source_directory(include HTTP_ENGINE_SOURCE_DIRS)
add_library(${TARGET_NAME} SHARED
${HTTP_ENGINE_SOURCE_DIRS}
${ENGINE_SOURCE_DIRS}
)
target_link_libraries(${TARGET_NAME}
libcivetweb-cpp.so
libcivetweb.so
${Boost_LIBRARIES}
${NLOHMANNJSON_LIBRARIES}
)
add_executable(${TARGET_NAME}_runner main.cc)
target_link_libraries(${TARGET_NAME}_runner
${TARGET_NAME}
)
#2.2 main.cc
#include <memory>
#include <unistd.h>
#include <nlohmann/json.hpp>
#include "CivetServer.h"
class OkView : public CivetHandler{
public:
bool handleGet(CivetServer *server, struct mg_connection *conn) override {
nlohmann::json json_data;
json_data["msg"] = "ok";
std::string s = json_data.dump(0);
char* c = const_cast<char*>(s.c_str());
mg_send_http_ok(conn, "application/json; charset=utf-8", s.size());
mg_write(conn, c, s.size());
return true;
}
bool handlePost(CivetServer *server, struct mg_connection *conn) override {
auto data = CivetServer::getPostData(conn); // post request data
return true;
}
bool handlePut(CivetServer *server, struct mg_connection *conn) override {
return true;
}
};
class HttpServer {
public:
HttpServer() {
mg_init_library(0);
std::vector<std::string> options = {
"document_root",".",
"listening_ports","10022"
};
m_server = std::make_unique<CivetServer>(options);
}
~HttpServer() {
m_server->close();
}
void run() {
OkView ok_view;
m_server->addHandler("/api/ok/", ok_view);
while (true) {
sleep(1);
}
mg_exit_library();
}
private:
std::unique_ptr<CivetServer> m_server;
};
int main() {
std::cout << "Hello, Civetweb!" << std::endl;
HttpServer server;
server.run();
return 0;
}