使用C++编写TCP服务端程序

要使用Boost.Asio库来开发一个TCP服务端程序,你需要遵循以下步骤。下面的示例代码将演示如何创建一个简单的异步TCP服务器,它能够接收客户端连接,并异步处理请求和响应。

首先,确保你已经安装了Boost库,并在你的项目中包含了asio库。

以下是基本的代码框架:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/system/error_code.hpp>
#include <iostream>
#include <memory>

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

class Server {
public:
    Server(boost::asio::io_context& io_context, short port)
        : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
    {
        // 启动监听
        start_accept();
    }

private:
    void start_accept() {
        // 创建新的socket
        std::shared_ptr<tcp::socket> new_socket = std::make_shared<tcp::socket>(acceptor_.get_executor().context());

        // 异步接受连接
        acceptor_.async_accept(*new_socket,
            [this, new_socket](boost::system::error_code ec) {
                if (!ec) {
                    std::cout << "New connection accepted." << std::endl;
                    // 异步读取请求数据
                    boost::asio::async_read(*new_socket, boost::asio::buffer(buffer_),
                        [this, new_socket](boost::system::error_code ec, std::size_t length) {
                            if (!ec) {
                                // 处理请求(这里只是简单地将接收到的数据原样返回)
                                boost::asio::async_write(*new_socket, boost::asio::buffer(buffer_, length),
                                    [new_socket](boost::system::error_code ec, std::size_t /*length*/) {
                                        if (ec) {
                                            std::cerr << "Error: " << ec.message() << std::endl;
                                        } else {
                                            std::cout << "Response sent successfully." << std::endl;
                                        }
                                    });
                            } else {
                                std::cerr << "Read failed: " << ec.message() << std::endl;
                            }
                        });

                    // 继续监听下一个连接
                    start_accept();
                } else {
                    std::cerr << "Accept failed: " << ec.message() << std::endl;
                }
            });
    }

    tcp::acceptor acceptor_;
    char buffer_[1024];
};

int main() {
    try {
        boost::asio::io_context io_context;

        Server s(io_context, 12345);

        io_context.run();
    }
    catch (std::exception& e) {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

在这个例子中:

  • 我们定义了一个Server类,它包含一个acceptor用于接受新连接。
  • start_accept函数用于启动异步接受过程,当有新的连接到达时,它会创建一个新的socket并绑定到一个lambda函数中,该函数处理读取请求、处理请求以及写入响应。
  • 请求数据被读取到buffer_中,然后原样返回给客户端。
  • 使用io_context.run()启动事件循环,处理所有的I/O操作。

相关推荐

  1. 使用C++编写TCP服务程序

    2024-07-12 00:36:01       24 阅读
  2. C++ TCP 服务和客户通信的例子

    2024-07-12 00:36:01       30 阅读
  3. Python---案例-多任务版TCP服务程序开发

    2024-07-12 00:36:01       59 阅读
  4. C++客户服务器TCP创建

    2024-07-12 00:36:01       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 00:36:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 00:36:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 00:36:01       57 阅读
  4. Python语言-面向对象

    2024-07-12 00:36:01       68 阅读

热门阅读

  1. 什么是AQS

    2024-07-12 00:36:01       19 阅读
  2. mvvm模式

    2024-07-12 00:36:01       25 阅读
  3. Mybatis-Plus最优化持久层开发

    2024-07-12 00:36:01       20 阅读
  4. C++ 定时器触发

    2024-07-12 00:36:01       24 阅读
  5. SqlSugar分表笔记

    2024-07-12 00:36:01       25 阅读
  6. 模板语法指令语法——02

    2024-07-12 00:36:01       21 阅读