#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;
}
boost asio学习笔记(1) echo服务端
最新推荐文章于 2025-01-15 19:00:44 发布