线程池,第二个实例
**
多线程 Echo Server
**
使用的线程池,和上一节一样的AsioIoContextPool,这里我就直接贴实例代码,有不懂的欢迎留言
server.h
#ifndef SERVER_H
#define SERVER_H
#include <iostream>
#include "ioContextPool.h"
using namespace boost::asio::ip;
class session
:public std::enable_shared_from_this<session>
{
public:
session(tcp::socket socket);
void start();
private:
void do_read();
void do_write(std::size_t length);
private:
tcp::socket socket_;
enum {max_length = 1024};
char data_[max_length];
};
class Server
{
public:
Server(boost::asio::io_context& io_context, short port);
private:
void do_accept();
tcp::acceptor acceptor_;
};
#endif // SERVER_H
server.cpp
#include "server.h"
session::session(tcp::socket socket)
:socket_(std::move(socket))
{
}
void session::start()
{
do_read();
}
void session::do_read()
{
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_,max_length),
[this,self](boost::system::error_code ec,std::size_t length)
{
if(!ec)
do_write(length);
});
}
void session::do_write(std::size_t length)
{
auto self(shared_from_this());
boost::asio::async_write(socket_,boost::asio::buffer(data_,length),
[this,self](boost::system::error_code ec,std::size_t )
{
if(!ec)
do_read();
});
}
Server::Server(boost::asio::io_context &io_context, short port)
:acceptor_(io_context,tcp::endpoint(tcp::v4(),port))
{
do_accept();
}
void Server::do_accept()
{
acceptor_.async_accept(
[this](boost::system::error_code ec, tcp::socket socket)
{
if(!ec)
std::make_shared<session>(std::move(socket))->start();
do_accept();
});
}
main函数
int main(int argc, char* argv[])
{
try
{
if (argc != 2)
{
std::cerr << "Usage: async_tcp_echo_server <port>\n";
return 1;
}
AsioIoContextPool pool;
Server s(pool.getIOCOntext(), std::atoi(argv[1]));
pool.stop(); //这里一定要调用该函数,使线程处于join状态
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
欢迎批评指正