NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.3: NDN, CCN, CCNx, content centric networks
API Documentation
echo_server_both.cpp
Go to the documentation of this file.
2 #include <websocketpp/server.hpp>
3 
4 #include <iostream>
5 
6 // define types for two different server endpoints, one for each config we are
7 // using
10 
11 // alias some of the bind related functions as they are a bit long
12 using websocketpp::lib::placeholders::_1;
13 using websocketpp::lib::placeholders::_2;
14 using websocketpp::lib::bind;
15 
16 // type of the ssl context pointer is long so alias it
17 typedef websocketpp::lib::shared_ptr<boost::asio::ssl::context> context_ptr;
18 
19 // The shared on_message handler takes a template parameter so the function can
20 // resolve any endpoint dependent types like message_ptr or connection_ptr
21 template <typename EndpointType>
22 void on_message(EndpointType* s, websocketpp::connection_hdl hdl,
23  typename EndpointType::message_ptr msg)
24 {
25  std::cout << "on_message called with hdl: " << hdl.lock().get()
26  << " and message: " << msg->get_payload()
27  << std::endl;
28 
29  try {
30  s->send(hdl, msg->get_payload(), msg->get_opcode());
31  } catch (const websocketpp::lib::error_code& e) {
32  std::cout << "Echo failed because: " << e
33  << "(" << e.message() << ")" << std::endl;
34  }
35 }
36 
37 // No change to TLS init methods from echo_server_tls
38 std::string get_password() {
39  return "test";
40 }
41 
43  std::cout << "on_tls_init called with hdl: " << hdl.lock().get() << std::endl;
44  context_ptr ctx(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1));
45 
46  try {
47  ctx->set_options(boost::asio::ssl::context::default_workarounds |
48  boost::asio::ssl::context::no_sslv2 |
49  boost::asio::ssl::context::no_sslv3 |
50  boost::asio::ssl::context::single_dh_use);
51  ctx->set_password_callback(bind(&get_password));
52  ctx->use_certificate_chain_file("server.pem");
53  ctx->use_private_key_file("server.pem", boost::asio::ssl::context::pem);
54  } catch (std::exception& e) {
55  std::cout << e.what() << std::endl;
56  }
57  return ctx;
58 }
59 
60 int main() {
61  // set up an external io_service to run both endpoints on. This is not
62  // strictly necessary, but simplifies thread management a bit.
63  boost::asio::io_service ios;
64 
65  // set up plain endpoint
66  server_plain endpoint_plain;
67  // initialize asio with our external io_service rather than an internal one
68  endpoint_plain.init_asio(&ios);
69  endpoint_plain.set_message_handler(
70  bind(&on_message<server_plain>,&endpoint_plain,::_1,::_2));
71  endpoint_plain.listen(80);
72  endpoint_plain.start_accept();
73 
74  // set up tls endpoint
75  server_tls endpoint_tls;
76  endpoint_tls.init_asio(&ios);
77  endpoint_tls.set_message_handler(
78  bind(&on_message<server_tls>,&endpoint_tls,::_1,::_2));
79  // TLS endpoint has an extra handler for the tls init
80  endpoint_tls.set_tls_init_handler(bind(&on_tls_init,::_1));
81  // tls endpoint listens on a different port
82  endpoint_tls.listen(443);
83  endpoint_tls.start_accept();
84 
85  // Start the ASIO io_service run loop running both endpoints
86  ios.run();
87 }
websocketpp::config::asio_tls_client::message_type::ptr message_ptr
void on_message(EndpointType *s, websocketpp::connection_hdl hdl, typename EndpointType::message_ptr msg)
websocketpp::lib::shared_ptr< boost::asio::ssl::context > context_ptr
websocketpp::server< websocketpp::config::asio_tls > server_tls
lib::weak_ptr< void > connection_hdl
A handle to uniquely identify a connection.
void init_asio(io_service_ptr ptr, lib::error_code &ec)
initialize asio transport with external io_service (exception free)
Definition: endpoint.hpp:181
void set_tls_init_handler(tls_init_handler h)
Set TLS init handler.
Definition: tls.hpp:455
void start_accept(lib::error_code &ec)
Starts the server&#39;s async connection acceptance loop (exception free)
context_ptr on_tls_init(websocketpp::connection_hdl hdl)
void listen(lib::asio::ip::tcp::endpoint const &ep, lib::error_code &ec)
Set up endpoint for listening manually (exception free)
Definition: endpoint.hpp:391
websocketpp::lib::shared_ptr< boost::asio::ssl::context > context_ptr
void set_message_handler(message_handler h)
Definition: endpoint.hpp:322
int main()
std::string get_password()
websocketpp::server< websocketpp::config::asio > server_plain