📄 ssl-server-fancy.cpp
字号:
// Read data from client (terminate on error).
char *request = 0;
for (;;)
{
ACE_INT32 len = 0;
if (parse_header_and_allocate_buffer (request,
&len) == -1)
return -1;
// Subtract off the sizeof the length prefix.
ssize_t r_bytes =
this->ssl_stream_ -> recv_n (request,
len - sizeof (ACE_UINT32));
if (r_bytes == -1)
{
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("recv")));
break;
}
else if (r_bytes == 0)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%P|%t) reached end of input, connection ")
ACE_TEXT ("closed by client\n")));
break;
}
else if (OPTIONS::instance ()->verbose ()
&& ACE::write_n (ACE_STDOUT,
request,
r_bytes) != r_bytes)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("ACE::write_n")));
else
{
ssize_t s_bytes =
(ssize_t) OPTIONS::instance ()->reply_message_len ();
// Don't try to send more than is in the request buffer!
if (s_bytes > r_bytes)
s_bytes = r_bytes;
if (this->ssl_stream_ -> send_n (request,
s_bytes) != s_bytes)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("send_n")));
}
this->total_bytes_ += size_t (r_bytes);
this->message_count_++;
delete [] request;
request = 0;
}
delete [] request;
return 0;
}
Oneway_Handler::Oneway_Handler (ACE_SSL_SOCK_Stream *ssl_stream)
: Handler (ssl_stream)
{
}
void
Oneway_Handler::print_results (void)
{
ACE_Profile_Timer::ACE_Elapsed_Time et;
this->timer_.elapsed_time (et);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("\t\treal time = %f secs \n\t\tuser time = %f secs \n\t\tsystem time = %f secs\n"),
et.real_time,
et.user_time,
et.system_time));
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("\t\tmessages = %d\n\t\ttotal bytes = %d\n\t\tmbits/sec = %f\n\t\tusec-per-message = %f\n"),
this->message_count_,
this->total_bytes_,
(((double) this->total_bytes_ * 8) / et.real_time) / (double) (1024 * 1024),
((et.user_time + et.system_time) / (double) this->message_count_) * ACE_ONE_SECOND_IN_USECS));
}
// Function entry point into the oneway server task.
int
Oneway_Handler::run (void)
{
// Read data from client (terminate on error).
char *request = 0;
for (;;)
{
ACE_INT32 len = 0;
if (parse_header_and_allocate_buffer (request,
&len) == -1)
return -1;
// Subtract off the sizeof the length prefix.
ssize_t r_bytes =
this->ssl_stream_ -> recv_n (request,
len - sizeof (ACE_UINT32));
if (r_bytes == -1)
{
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("recv")));
break;
}
else if (r_bytes == 0)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%P|%t) reached end of input, connection ")
ACE_TEXT ("closed by client\n")));
break;
}
else if (OPTIONS::instance ()->verbose ()
&& ACE::write_n (ACE_STDOUT,
request,
r_bytes) != r_bytes)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("ACE::write_n")));
this->total_bytes_ += size_t (r_bytes);
this->message_count_++;
delete [] request;
request = 0;
}
delete [] request;
return 0;
}
// Create a twoway handler.
Handler *
Handler_Factory::make_twoway_handler (ACE_SSL_SOCK_Stream *ssl_stream)
{
return new Twoway_Handler (ssl_stream);
}
// Create a oneway handler.
Handler *
Handler_Factory::make_oneway_handler (ACE_SSL_SOCK_Stream *ssl_stream)
{
return new Oneway_Handler (ssl_stream);
}
int
Handler_Factory::init_acceptors (void)
{
// Create the oneway and twoway server addresses.
ACE_INET_Addr twoway_server_addr (OPTIONS::instance ()->port ());
ACE_INET_Addr oneway_server_addr (OPTIONS::instance ()->port () + 1);
// Create acceptors, reuse the address.
if (this->twoway_acceptor_.open (twoway_server_addr, 1) == -1
|| this->oneway_acceptor_.open (oneway_server_addr, 1) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("open")),
-1);
else if (this->twoway_acceptor_.get_local_addr (twoway_server_addr) == -1
|| this->oneway_acceptor_.get_local_addr (oneway_server_addr) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("get_local_addr")),
-1);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%P|%t) starting twoway server at port %d and oneway server at port %d\n"),
twoway_server_addr.get_port_number (),
oneway_server_addr.get_port_number ()));
return 0;
}
int
Handler_Factory::create_handler (
ACE_SSL_SOCK_Acceptor &acceptor,
Handler * (*handler_factory) (ACE_SSL_SOCK_Stream* ),
const char *handler_type)
{
ACE_SSL_SOCK_Stream* new_stream;
ACE_NEW_RETURN (new_stream, ACE_SSL_SOCK_Stream, -1);
if (acceptor.accept (*new_stream) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("accept")),
-1);
Handler *handler;
ACE_ALLOCATOR_RETURN (handler,
(*handler_factory) (new_stream),
-1);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%P|%t) spawning %s handler\n"),
handler_type));
if (handler->open () == -1)
return -1;
#if defined (ACE_MT_SAFE)
// Spawn a new thread and run the new connection in that thread of
// control using the <server> function as the entry point.
return handler->activate ();
#else
handler->svc ();
handler->close (0);
return 0;
#endif /* ACE_HAS_THREADS */
}
Handler_Factory::Handler_Factory (void)
{
}
Handler_Factory::~Handler_Factory (void)
{
this->twoway_acceptor_.close ();
this->oneway_acceptor_.close ();
}
// Run the main event loop.
int
Handler_Factory::handle_events (void)
{
if (this->init_acceptors () == -1)
return -1;
fd_set handles;
FD_ZERO (&handles);
FD_SET ((ACE_SOCKET) this->twoway_acceptor_.get_handle (), &handles);
FD_SET ((ACE_SOCKET) this->oneway_acceptor_.get_handle (), &handles);
// Performs the iterative server activities.
for (;;)
{
ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
fd_set temp = handles;
int result =
ACE_OS::select (int (this->oneway_acceptor_.get_handle ()) + 1,
(fd_set *) &temp,
0,
0,
timeout);
if (result == -1)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("(%P|%t) %p\n"),
ACE_TEXT ("select")));
else if (result == 0 && OPTIONS::instance ()->verbose ())
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%P|%t) select timed out\n")));
else
{
if (FD_ISSET (this->twoway_acceptor_.get_handle (),
&temp))
this->create_handler (this->twoway_acceptor_,
&Handler_Factory::make_twoway_handler,
"twoway");
if (FD_ISSET (this->oneway_acceptor_.get_handle (),
&temp))
this->create_handler (this->oneway_acceptor_,
&Handler_Factory::make_oneway_handler,
"oneway");
}
}
ACE_NOTREACHED (return 0;)
}
int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
ACE_SSL_Context *context = ACE_SSL_Context::instance ();
context->certificate ("./dummy.pem", SSL_FILETYPE_PEM);
context->private_key ("./key.pem", SSL_FILETYPE_PEM);
OPTIONS::instance ()->parse_args (argc, argv);
Handler_Factory server;
return server.handle_events ();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -