// session class 의 정체는
// client socket에서 data를 read/write 하는 놈이다.
class session
// boost::enable_shared_from_this 이건 뭐지? 스마트 포인터 옵션인가?
// client socket에서 data를 read/write 하는 놈이다.
class session
// boost::enable_shared_from_this 이건 뭐지? 스마트 포인터 옵션인가?
: public boost::enable_shared_from_this<session>
{
public:
// 생성자는 멤버 tcp::socket에 io_service를 전달하는 역할만.
// 생성자는 멤버 tcp::socket에 io_service를 전달하는 역할만.
session(boost::asio::io_service& io_service)
: socket_(io_service)
{
}
//tcp::socket을 public으로 노출시키는 것을 보니 딴데서 쓰기도 하는가보군~
tcp::socket& socket()
{
return socket_;
}
// server::handle_accept 에서 호출했던 녀석
void start()
{
//읽기 동작 역시 비동기로.. 앞서 보았던 tcp::acceptor.async_accept() 함수와 같다.
// 단지 bind시키는 callback함수가 약간 다른 정도?
//읽기 동작 역시 비동기로.. 앞서 보았던 tcp::acceptor.async_accept() 함수와 같다.
// 단지 bind시키는 callback함수가 약간 다른 정도?
socket_.async_read_some(boost::asio::buffer(data_),
make_custom_alloc_handler(allocator_,
boost::bind(&session::handle_read,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)));
}
// 두 번째 파라미터로 읽은 byte size를 전달.
void handle_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (!error)
{
// data를 읽었으면, 그 다음은 바로 async_write()동작을 수행.
// 아마 echo 서버인가보다.
// --> 이건 뭐지? boost::asio::buffer
// data를 읽었으면, 그 다음은 바로 async_write()동작을 수행.
// 아마 echo 서버인가보다.
// --> 이건 뭐지? boost::asio::buffer
// --> 이건 뭐지? make_custom_alloc_handler
// --> bind할 때 shared_from_this()가 들어가는 이유는....
// 아마도 shared_ptr 내부에서는 this를 호출할 수 없어서인가보다.
// --> bind할 때 shared_from_this()가 들어가는 이유는....
// 아마도 shared_ptr 내부에서는 this를 호출할 수 없어서인가보다.
boost::asio::async_write(socket_,
boost::asio::buffer(data_, bytes_transferred),
make_custom_alloc_handler(allocator_,
boost::bind(&session::handle_write,
shared_from_this(),
boost::asio::placeholders::error)));
}
}
void handle_write(const boost::system::error_code& error)
{
if (!error)
{
socket_.async_read_some(boost::asio::buffer(data_),
make_custom_alloc_handler(allocator_,
boost::bind(&session::handle_read,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)));
}
}
private:
// The socket used to communicate with the client.
tcp::socket socket_;
// Buffer used to store data received from the client.
boost::array<char, 1024> data_;
// The allocator to use for handler-based custom memory allocation.
handler_allocator allocator_;
};
의문점:
make_custom_alloc_handler 와 handler_allocator class의 관계는?
의문점:
make_custom_alloc_handler 와 handler_allocator class의 관계는?