以下是一些 Boost.Asio 的示例代码,涵盖了常见的用例,如异步操作、定时器、Socket 编程等。通过这些示例,你可以更好地理解 Boost.Asio 的使用方法。

1. 异步操作示例

异步读取数据

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

void read_handler(const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        std::cout << "Read " << bytes_transferred << " bytes" << std::endl;
    } else {
        std::cerr << "Read error: " << error.message() << std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::steady_timer timer(io_context, std::chrono::seconds(1));
    
    timer.async_wait([](const boost::system::error_code& error) {
        if (!error) {
            std::cout << "Timer expired!" << std::endl;
        }
    });

    io_context.run(); // 运行 I/O 服务
    return 0;
}

2. 定时器示例

设置定时器和回调函数

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

void timer_handler(const boost::system::error_code& error) {
    if (!error) {
        std::cout << "Timer expired!" << std::endl;
    } else {
        std::cerr << "Timer error: " << error.message() << std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::steady_timer timer(io_context, std::chrono::seconds(5)); // 5 秒后超时

    timer.async_wait(timer_handler);

    io_context.run(); // 运行 I/O 服务
    return 0;
}

3. Socket 编程示例

异步 TCP 连接

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

void connect_handler(const boost::system::error_code& error) {
    if (!error) {
        std::cout << "Connected to the server!" << std::endl;
    } else {
        std::cerr << "Connect error: " << error.message() << std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::ip::tcp::resolver resolver(io_context);
    boost::asio::ip::tcp::resolver::results_type endpoints = resolver.resolve("example.com", "80");
    
    boost::asio::ip::tcp::socket socket(io_context);
    boost::asio::async_connect(socket, endpoints, connect_handler);

    io_context.run(); // 运行 I/O 服务
    return 0;
}

异步读取数据

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

void read_handler(const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        std::cout << "Read " << bytes_transferred << " bytes" << std::endl;
    } else {
        std::cerr << "Read error: " << error.message() << std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::ip::tcp::socket socket(io_context);
    
    // 假设 socket 已经连接到某个服务器
    std::array<char, 128> buffer;
    boost::asio::async_read(socket, boost::asio::buffer(buffer),
        boost::asio::transfer_at_least(1), read_handler);

    io_context.run(); // 运行 I/O 服务
    return 0;
}

4. 定时器与 I/O 操作结合示例

使用定时器设置超时

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

void read_timeout_handler(const boost::system::error_code& error) {
    if (!error) {
        std::cerr << "Read operation timed out!" << std::endl;
    }
}

void read_handler(const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        std::cout << "Read " << bytes_transferred << " bytes" << std::endl;
    } else {
        std::cerr << "Read error: " << error.message() << std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::ip::tcp::socket socket(io_context);
    boost::asio::steady_timer timer(io_context);

    // 设置定时器超时为 5 秒
    timer.expires_after(std::chrono::seconds(5));
    timer.async_wait(read_timeout_handler);

    // 假设 socket 已经连接到某个服务器
    std::array<char, 128> buffer;
    boost::asio::async_read(socket, boost::asio::buffer(buffer),
        boost::asio::transfer_at_least(1), read_handler);

    io_context.run(); // 运行 I/O 服务
    return 0;
}

5. 异步写入数据示例

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

void write_handler(const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        std::cout << "Wrote " << bytes_transferred << " bytes" << std::endl;
    } else {
        std::cerr << "Write error: " << error.message() << std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::ip::tcp::socket socket(io_context);
    
    // 假设 socket 已经连接到某个服务器
    std::string message = "Hello, Boost.Asio!";
    boost::asio::async_write(socket, boost::asio::buffer(message),
        write_handler);

    io_context.run(); // 运行 I/O 服务
    return 0;
}

总结

这些示例代码展示了 Boost.Asio 的不同用例,包括异步操作、定时器、Socket 编程及其结合使用。每个示例中,io_context.run() 调用负责处理所有异步操作和事件。根据实际需要,你可以扩展和调整这些示例以适应特定的应用场景。