5 #ifndef PACKIO_SERVER_H
6 #define PACKIO_SERVER_H
14 #include "internal/config.h"
15 #include "internal/log.h"
16 #include "internal/utils.h"
26 template <
typename Rpc,
typename Acceptor,
typename Dispatcher = dispatcher<Rpc>>
28 :
public std::enable_shared_from_this<server<Rpc, Acceptor, Dispatcher>> {
35 typename acceptor_type::executor_type;
37 std::declval<acceptor_type>().accept())>;
40 using std::enable_shared_from_this<server<Rpc, Acceptor, Dispatcher>>::shared_from_this;
63 std::shared_ptr<dispatcher_type>
dispatcher() {
return dispatcher_ptr_; }
65 std::shared_ptr<const dispatcher_type>
dispatcher()
const
67 return dispatcher_ptr_;
78 template <PACKIO_COMPLETION_TOKEN_FOR(
void(error_code, std::shared_ptr<session_type>))
79 ServeHandler PACKIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
81 ServeHandler&& handler PACKIO_DEFAULT_COMPLETION_TOKEN(
executor_type))
83 return net::async_initiate<
85 void(error_code, std::shared_ptr<session_type>)>(
86 initiate_async_serve(
this), handler);
92 async_serve([
self = shared_from_this()](
auto ec,
auto session) {
98 self->async_serve_forever();
103 class initiate_async_serve {
107 explicit initiate_async_serve(
server*
self) : self_(self) {}
111 return self_->get_executor();
114 template <
typename ServeHandler>
115 void operator()(ServeHandler&& handler)
117 PACKIO_STATIC_ASSERT_TTRAIT(ServeHandler, session_type);
118 PACKIO_TRACE(
"async_serve");
120 self_->acceptor_.async_accept(
121 [
self = self_->shared_from_this(),
122 handler = std::forward<ServeHandler>(handler)](
124 std::shared_ptr<session_type> session;
126 PACKIO_WARN(
"accept error: {}", ec.message());
129 internal::set_no_delay(sock);
130 session = std::make_shared<session_type>(
131 std::move(sock), self->dispatcher_ptr_);
133 handler(ec, std::move(session));
141 acceptor_type acceptor_;
142 std::shared_ptr<dispatcher_type> dispatcher_ptr_;
149 template <
typename Rpc,
typename Acceptor,
typename Dispatcher = dispatcher<Rpc>>
152 return std::make_shared<server<Rpc, Acceptor, Dispatcher>>(
153 std::forward<Acceptor>(acceptor));
158 #endif // PACKIO_SERVER_H