目录

  1. C++ Web 编程概述
  2. 常见的 C++ Web 框架
  3. C++ 服务器端编程
    • 使用 Boost.Asio 构建 HTTP 服务器
    • 使用 Cpp-HTTPLib 处理 Web 请求
    • 使用 Crow 创建 RESTful API
  4. C++ 客户端编程
    • 使用 libcurl 发送 HTTP 请求
    • 使用 Boost.Beast 解析 HTTP 响应
  5. C++ WebSocket 编程
    • 使用 Boost.Beast 创建 WebSocket 服务器和客户端
  6. C++ Web 应用集成数据库
    • 连接 MySQL(使用 MySQL Connector/C++)
    • 连接 PostgreSQL(使用 libpqxx)
  7. C++ 与前端交互(JSON、REST API)
    • 解析 JSON(使用 nlohmann/json
    • 处理 RESTful API
  8. C++ Web 编程最佳实践
  9. 参考资料

1. C++ Web 编程概述

C++ 主要用于高性能 Web 服务器、API 网关和后端应用,适用于:

  • 高并发 HTTP 服务器(如 Nginx、Apache Traffic Server)
  • 游戏服务器(如 Unreal Engine 服务器)
  • 金融系统(低延迟 Web 服务)
  • IoT 云服务(如 MQTT 代理)

C++ Web 编程主要涉及 服务器端开发(HTTP 服务器、REST API)客户端开发(HTTP 请求、WebSocket)


2. 常见的 C++ Web 框架

2.1 轻量级框架

框架说明
Cpp-HTTPLib轻量级 HTTP 库,无需额外依赖
Crow类似 Flask 的 Web 框架,支持 REST API
Drogon高性能 Web 框架,支持 C++17/20

2.2 高性能框架

框架说明
Pistache适用于 REST API,基于 epoll
Boost.Beast适用于 HTTP 和 WebSocket 服务器
Restbed适用于构建 RESTful API

3. C++ 服务器端编程

3.1 使用 Boost.Asio 创建 HTTP 服务器

Boost.Asio 是 C++ 网络编程的核心库,可用于构建 HTTP 服务器:

#include <boost/asio.hpp>
#include <iostream>

using boost::asio::ip::tcp;

void handle_client(tcp::socket socket) {
    std::string response = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!";
    boost::asio::write(socket, boost::asio::buffer(response));
}

int main() {
    boost::asio::io_context io_context;
    tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8080));

    while (true) {
        tcp::socket socket(io_context);
        acceptor.accept(socket);
        handle_client(std::move(socket));
    }
}

说明:

  • tcp::acceptor 监听 8080 端口
  • handle_client 处理 HTTP 请求并返回 Hello, World!

3.2 使用 Cpp-HTTPLib 创建 Web 服务器

Cpp-HTTPLib 是一个轻量级的 C++ HTTP 服务器库:

#include "httplib.h"

int main() {
    httplib::Server svr;
    svr.Get("/", [](const httplib::Request&, httplib::Response& res) {
        res.set_content("Hello, World!", "text/plain");
    });

    svr.listen("0.0.0.0", 8080);
}

特点:

  • 只需一个 .h 头文件
  • 支持 GETPOSTPUTDELETE

3.3 使用 Crow 创建 RESTful API

Crow 是 C++ 版的 Flask:

#include "crow.h"

int main() {
    crow::SimpleApp app;

    CROW_ROUTE(app, "/")([]() {
        return "Hello, World!";
    });

    app.port(8080).multithreaded().run();
}

特点:

  • 支持 JSON API
  • 多线程处理请求

4. C++ 客户端编程

4.1 使用 libcurl 发送 HTTP 请求

libcurl 是最常用的 C++ HTTP 客户端库:

#include <iostream>
#include <curl/curl.h>

size_t write_callback(void* contents, size_t size, size_t nmemb, std::string* output) {
    output->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main() {
    CURL* curl = curl_easy_init();
    if (curl) {
        std::string response;
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        std::cout << "Response: " << response << std::endl;
    }
}


5. C++ WebSocket 编程

5.1 使用 Boost.Beast 创建 WebSocket 服务器

#include <boost/beast.hpp>
#include <boost/asio.hpp>
#include <iostream>

using namespace boost::asio;
using namespace boost::beast;

void session(tcp::socket socket) {
    websocket::stream<tcp::socket> ws(std::move(socket));
    ws.accept();
    ws.text(true);
    ws.write(net::buffer("Hello WebSocket!"));
}

int main() {
    io_context ioc;
    tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 9000));

    while (true) {
        tcp::socket socket(ioc);
        acceptor.accept(socket);
        std::thread(session, std::move(socket)).detach();
    }
}

特点:

  • 使用 Boost.Beast 处理 WebSocket 连接
  • 适用于实时应用,如聊天室、游戏服务器

6. C++ Web 应用集成数据库

6.1 连接 MySQL

#include <mysql_driver.h>
#include <mysql_connection.h>

using namespace sql;

int main() {
    sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();
    std::unique_ptr<Connection> con(driver->connect("tcp://127.0.0.1:3306", "user", "password"));
    con->setSchema("testdb");
}


7. C++ 与前端交互(JSON、REST API)

7.1 解析 JSON(使用 nlohmann/json)

#include <iostream>
#include <nlohmann/json.hpp>

int main() {
    nlohmann::json j = {{"name", "Alice"}, {"age", 25}};
    std::cout << j.dump(4) << std::endl;
}

特点:

  • 简单易用
  • 支持序列化和反序列化

8. C++ Web 编程最佳实践

  • 使用合适的框架(轻量级 HTTPLib,或者高性能 Crow、Drogon)
  • 避免阻塞 I/O(使用异步 Boost.Asio)
  • 使用 JSON 作为数据格式(nlohmann/json)
  • 使用线程池提高性能(std::thread 或 Boost.Thread)
  • 确保线程安全(使用 std::mutexstd::atomic

9. 参考资料