28 #ifndef WEBSOCKETPP_SERVER_ENDPOINT_HPP
29 #define WEBSOCKETPP_SERVER_ENDPOINT_HPP
31 #include <websocketpp/endpoint.hpp>
33 #include <websocketpp/logger/levels.hpp>
35 #include <websocketpp/common/system_error.hpp>
43 template <
typename config>
47 typedef server<config> type;
50 typedef typename config::concurrency_type concurrency_type;
52 typedef typename config::transport_type transport_type;
57 typedef typename connection_type::ptr connection_ptr;
60 typedef typename transport_type::transport_con_type transport_con_type;
62 typedef typename transport_con_type::ptr transport_con_ptr;
65 typedef endpoint<connection_type,config> endpoint_type;
69 explicit server() : endpoint_type(
true)
71 endpoint_type::m_alog->write(log::alevel::devel,
"server constructor");
77 #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
79 server<config>(server<config> &) =
delete;
82 server<config> & operator=(server<config>
const &) =
delete;
85 #ifdef _WEBSOCKETPP_MOVE_SEMANTICS_
87 server<config>(server<config> && o) : endpoint<connection<config>,config>(std::move(o)) {}
89 #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
91 server<config> & operator=(server<config> &&) =
delete;
106 connection_ptr get_connection() {
107 return endpoint_type::create_connection();
121 void start_accept(lib::error_code & ec) {
122 if (!transport_type::is_listening()) {
123 ec = error::make_error_code(error::async_accept_not_listening);
127 ec = lib::error_code();
128 connection_ptr con = get_connection();
131 ec = error::make_error_code(error::con_creation_failed);
135 transport_type::async_accept(
136 lib::static_pointer_cast<transport_con_type>(con),
137 lib::bind(&type::handle_accept,
this,con,lib::placeholders::_1),
144 con->terminate(lib::error_code());
157 void start_accept() {
166 void handle_accept(connection_ptr con, lib::error_code
const & ec) {
170 if (ec == error::operation_canceled) {
171 endpoint_type::m_elog->write(log::elevel::info,
172 "handle_accept error: "+ec.message());
174 endpoint_type::m_elog->write(log::elevel::rerror,
175 "handle_accept error: "+ec.message());
181 lib::error_code start_ec;
182 start_accept(start_ec);
183 if (start_ec == error::async_accept_not_listening) {
184 endpoint_type::m_elog->write(log::elevel::info,
185 "Stopping acceptance of new connections because the underlying transport is no longer listening.");
186 }
else if (start_ec) {
187 endpoint_type::m_elog->write(log::elevel::rerror,
188 "Restarting async_accept loop failed: "+ec.message());