void ssl_acceptot_proc(void *arg) { iocp::fiber_acceptor *acceptor = static_cast<iocp::fiber_acceptor *>(arg); iocp::error_code ec; ec = acceptor->bind_and_listen(iocp::address::any, 60443, 500); if (ec) std::cerr << "bind & listen: " << ec.to_string() << std::endl; ssl::init(); ssl::context server_ctx(ssl::sslv23_server), client_ctx(ssl::sslv23_client); server_ctx.use_certificate_file("chain.pem", ssl::pem); server_ctx.use_rsa_private_key_file("privkey.pem", ssl::pem); iocp::fiber_ssl_socket *ns; for (;;) { ns = new iocp::fiber_ssl_socket(server_ctx, acceptor->service()); ec = acceptor->accept(*ns); if (ec) { std::cerr << "accept: " << ec.to_string() << std::endl; break; } else { ns->invoke(ssl_proc, ns); } } }
/* * A server thread (task) * assumes network is started and shutdown by parent thread */ server_task (XML *xml) { SSL_CTX *ctx; NETCON *conn, *ssl; int port, threads, e; if ((threads = xml_get_int (xml, "Phineas.Server.NumThreads")) == 0) threads = 2; if (port = xml_get_int (xml, "Phineas.Server.Port")) { if ((conn = net_open ("ANY", port, threads, NULL)) == NULL) { return (phineas_fatal ("Failed to open port %d\n", port)); } } if (port = xml_get_int (xml, "Phineas.Server.SSL.Port")) { ctx = server_ctx (xml); if ((ssl = net_open ("ANY", port, threads, ctx)) == NULL) { if (conn != NULL) net_close (conn); return (phineas_fatal ("Failed to open SSL port %d\n", port)); } if (conn != NULL) threads *= 2; } e = server_listen (xml, conn, ssl, ctx, threads); if (conn != NULL) net_close (conn); if (ssl != NULL) { net_close (ssl); if (ctx != NULL) SSL_CTX_free (ctx); } if (e) phineas_fatal ("Failed to start PHINEAS server"); return (0); }