22#include <glog/logging.h>
29AsyncAcceptor::Session::Session(boost::asio::io_service* io_service,
30 CallBack call_back_func)
31 : io_service_(io_service),
32 client_socket_(*io_service_),
33 recv_buffer_(nullptr),
35 call_back_func_(call_back_func) {}
37AsyncAcceptor::Session::~Session() { Close(); }
39boost::asio::ip::tcp::socket* AsyncAcceptor::Session::GetSocket() {
40 return &client_socket_;
43void AsyncAcceptor::Session::Close() {
44 if (client_socket_.is_open()) {
45 client_socket_.cancel();
47 if (recv_buffer_ && status_ != 0) {
49 recv_buffer_ =
nullptr;
53void AsyncAcceptor::Session::StartRead() {
56 recv_buffer_ =
reinterpret_cast<char*
>(&data_size_);
58 need_size_ =
sizeof(data_size_);
60 memset(recv_buffer_, 0, need_size_);
63 need_size_ = data_size_;
68 recv_buffer_ =
new char[need_size_];
69 memset(recv_buffer_, 0, need_size_);
74void AsyncAcceptor::Session::ReadDone() {
76 call_back_func_(recv_buffer_, data_size_);
79 data_size_ = *
reinterpret_cast<size_t*
>(recv_buffer_);
80 if (data_size_ > 1e6) {
81 LOG(ERROR) <<
"read data size:" << data_size_
82 <<
" data size:" <<
sizeof(data_size_) <<
" close socket";
88 recv_buffer_ =
nullptr;
93void AsyncAcceptor::Session::OnRead() {
94 client_socket_.async_read_some(
95 boost::asio::buffer(recv_buffer_ + current_idx_,
96 need_size_ - current_idx_),
97 [&](
const boost::system::error_code& error,
98 std::size_t bytes_transferred) {
99 if (error || bytes_transferred == 0) {
102 current_idx_ += bytes_transferred;
103 if (current_idx_ >= need_size_) {
112AsyncAcceptor::AsyncAcceptor(
const std::string& ip,
int port,
int thread_num,
114 : endpoint_(boost::asio::ip::address::from_string(ip), port),
115 acceptor_(io_service_, endpoint_),
116 call_back_func_(call_back_func) {
117 worker_ = std::make_unique<boost::asio::io_service::work>(io_service_);
118 for (
int i = 0; i < thread_num; ++i) {
119 worker_thread_.push_back(std::thread([&]() { io_service_.run(); }));
128 for (
auto& sess : sessions_) {
134 for (
auto& worker : worker_thread_) {
135 if (worker.joinable()) {
142 boost::shared_ptr<Session> client_session(
143 new Session(&io_service_, call_back_func_));
144 acceptor_.async_accept(*client_session->GetSocket(),
145 std::bind(&AsyncAcceptor::OnAccept,
this,
146 client_session, std::placeholders::_1));
149void AsyncAcceptor::OnAccept(boost::shared_ptr<Session> client_session,
150 const boost::system::error_code ec) {
152 LOG(ERROR) <<
" accept fail";
158 sessions_.push_back(client_session);
159 client_session->StartRead();
std::function< void(const char *buffer, size_t len)> CallBack