boost.asio async server example
C++
x
115
115
1
2
3
4
5
6
7
8
9
10
11
const short PORT_NUM = 7707;
12
const short BLOG_SIZE = 5;
13
const short MAX_MSG_LEN = 256;
14
15
std::vector<std::thread> workers;
16
std::mutex mutexG;
17
18
using boost::asio::ip::tcp;
19
20
class session : public std::enable_shared_from_this<session>
21
{
22
public:
23
session(tcp::socket socket) : socket_(std::move(socket))
24
{
25
26
}
27
void start()
28
{
29
do_read();
30
}
31
private:
32
void do_read() {
33
auto self(shared_from_this());
34
socket_.async_read_some(boost::asio::buffer(data_, MAX_MSG_LEN),
35
[this, self](boost::system::error_code ec, std::size_t length)
36
{
37
if (!ec) {
38
{
39
std::lock_guard<std::mutex> lock_guard(mutexG);
40
std::stringstream ss;
41
ss << std::this_thread::get_id();
42
printf("[%d] recv: %s \n", ss.str().c_str(), data_);
43
}
44
do_write(length);
45
}
46
}
47
);
48
}
49
void do_write(std::size_t length) {
50
auto self(shared_from_this());
51
boost::asio::async_write(socket_, boost::asio::buffer(data_, MAX_MSG_LEN),
52
[this, self](boost::system::error_code ec, std::size_t /*length*/)
53
{
54
if (!ec) {
55
do_read();
56
}
57
}
58
);
59
}
60
tcp::socket socket_;
61
char data_[MAX_MSG_LEN];
62
};
63
class server
64
{
65
public:
66
server(boost::asio::io_context& io_context, short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), socket_(io_context)
67
{
68
do_accept();
69
}
70
private:
71
void do_accept()
72
{
73
acceptor_.async_accept(socket_,
74
[this](boost::system::error_code ec) {
75
if (!ec) {
76
{
77
std::lock_guard<std::mutex> lock_guard(mutexG);
78
std::stringstream ss;
79
ss << std::this_thread::get_id();
80
printf("[%d] accept: \n", ss.str().c_str());
81
}
82
std::make_shared<session>(std::move(socket_))->start();
83
}
84
do_accept();
85
});
86
}
87
tcp::acceptor acceptor_;
88
tcp::socket socket_;
89
};
90
91
void worker(boost::asio::io_context& io_context)
92
{
93
io_context.run();
94
}
95
int main()
96
{
97
std::stringstream ss;
98
ss << std::this_thread::get_id();
99
printf("[%s] main : \n", ss.str().c_str());
100
101
boost::asio::io_context io_context_S;
102
std::vector<std::thread> workers;
103
server s(io_context_S, PORT_NUM);
104
105
for (DWORD i = 0; i < 1; ++i) {
106
workers.emplace_back(std::thread(&worker, std::ref(io_context_S)));
107
}
108
109
while (1) {
110
111
}
112
113
114
return 0;
115
}
소스 코드는 boost 기본 샘플을 기반해서 작성하였음
댓글 남기기