Пример #1
0
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);
		}
	}
}
Пример #2
0
/*
 * 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);
}