boost asio学习笔记(1) echo服务端

本文介绍如何使用 C++ 和 Boost.ASIO 库实现一个简单的异步 TCP 服务器。该服务器能够接收客户端连接并回显接收到的数据。通过创建 Session 类处理每个连接,并在 Server 类中启动接受过程来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

const int MAX_MESS_SIZE = 4096;

class Session : public std::enable_shared_from_this < Session >
{
public:
    Session(boost::asio::io_service &ios) : m_socket(ios){}

    void start()
    {
        read_from_socket();
    }

    void read_from_socket()
    {
        auto shared_self(shared_from_this());
        m_socket.async_read_some(boost::asio::buffer(m_buff), [this, shared_self](const boost::system::error_code &error, size_t bytes_transferred)
        {
            if (!error)
            {
                write_to_socket(bytes_transferred);
            }
        });
    }

    void write_to_socket(size_t bytes_transferred)
    {
        auto shared_self(shared_from_this());
        boost::asio::async_write(m_socket, boost::asio::buffer(m_buff), [this, shared_self](const boost::system::error_code &err, size_t)
        {
            if (!err)
            {
                read_from_socket();
            }
        });
    }

    boost::asio::ip::tcp::socket& get_socket()
    {
        return m_socket;
    }

private:
    boost::asio::ip::tcp::socket m_socket; // socket禁止拷贝
    std::array<char, MAX_MESS_SIZE> m_buff; // 缓冲区
};

class Server
{
public:
    Server(boost::asio::io_service &ios) : m_ios(ios), m_acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 5555)) {}

    void start_accept()
    {
        std::cout << "start accpet ..." << std::endl;
        auto ptr = std::make_shared<Session>(m_ios);

        m_acceptor.async_accept(ptr->get_socket(), [this, ptr](const boost::system::error_code &err)
        {
            if (!err)
            {
                ptr->start();
            }
            start_accept();
        });
    }

private:
    boost::asio::io_service &m_ios;
    boost::asio::ip::tcp::acceptor m_acceptor;
};

int main()
{
    boost::asio::io_service ios;

    Server ser(ios);
    ser.start_accept();

    ios.run();

    return 0;
}

服务端代码运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值