boost.asio async server example
#include <iostream>
#include <thread>
#include <functional>
#include <atomic>
#include <mutex>
#include <functional>
#include <vector>
#include <boost/asio.hpp>
const short PORT_NUM = 7707;
const short BLOG_SIZE = 5;
const short MAX_MSG_LEN = 256;
std::vector<std::thread> workers;
std::mutex mutexG;
using boost::asio::ip::tcp;
class session : public std::enable_shared_from_this<session>
{
public:
session(tcp::socket socket) : socket_(std::move(socket))
{
}
void start()
{
do_read();
}
private:
void do_read() {
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, MAX_MSG_LEN),
[this, self](boost::system::error_code ec, std::size_t length)
{
if (!ec) {
{
std::lock_guard<std::mutex> lock_guard(mutexG);
std::stringstream ss;
ss << std::this_thread::get_id();
printf("[%d] recv: %s \n", ss.str().c_str(), data_);
}
do_write(length);
}
}
);
}
void do_write(std::size_t length) {
auto self(shared_from_this());
boost::asio::async_write(socket_, boost::asio::buffer(data_, MAX_MSG_LEN),
[this, self](boost::system::error_code ec, std::size_t /*length*/)
{
if (!ec) {
do_read();
}
}
);
}
tcp::socket socket_;
char data_[MAX_MSG_LEN];
};
class server
{
public:
server(boost::asio::io_context& io_context, short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), socket_(io_context)
{
do_accept();
}
private:
void do_accept()
{
acceptor_.async_accept(socket_,
[this](boost::system::error_code ec) {
if (!ec) {
{
std::lock_guard<std::mutex> lock_guard(mutexG);
std::stringstream ss;
ss << std::this_thread::get_id();
printf("[%d] accept: \n", ss.str().c_str());
}
std::make_shared<session>(std::move(socket_))->start();
}
do_accept();
});
}
tcp::acceptor acceptor_;
tcp::socket socket_;
};
void worker(boost::asio::io_context& io_context)
{
io_context.run();
}
int main()
{
std::stringstream ss;
ss << std::this_thread::get_id();
printf("[%s] main : \n", ss.str().c_str());
boost::asio::io_context io_context_S;
std::vector<std::thread> workers;
server s(io_context_S, PORT_NUM);
for (DWORD i = 0; i < 1; ++i) {
workers.emplace_back(std::thread(&worker, std::ref(io_context_S)));
}
while (1) {
}
return 0;
}소스 코드는 boost 기본 샘플을 기반해서 작성하였음
댓글 남기기