int twoway_server (ACE_SSL_SOCK_Stream &stream) { ACE_INET_Addr cli_addr; // Make sure we're not in non-blocking mode. if (stream.disable (ACE_NONBLOCK) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "disable"), 0); else if (stream.get_remote_addr (cli_addr) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "get_remote_addr"), 0); ACE_DEBUG ((LM_DEBUG, "(%P|%t) client %s connected from %d\n", cli_addr.get_host_name (), cli_addr.get_port_number ())); size_t total_bytes = 0; size_t message_count = 0; char *request = 0; // Read data from client (terminate on error). for (;;) { ACE_INT32 len; ssize_t r_bytes = stream.recv_n ((void *) &len, sizeof (ACE_INT32)); if (r_bytes == -1) { ACE_ERROR ((LM_ERROR, "%p\n", "recv")); break; } else if (r_bytes == 0) { ACE_DEBUG ((LM_DEBUG, "(%P|%t) reached end of input, connection closed by client\n")); break; } else if (r_bytes != sizeof (ACE_INT32)) { ACE_ERROR ((LM_ERROR, "(%P|%t) %p\n", "recv_n failed")); break; } else { len = ntohl (len); ACE_NEW_RETURN (request, char [len], 0); } // Subtract off the sizeof the length prefix. r_bytes = stream.recv_n (request, len - sizeof (ACE_UINT32)); if (r_bytes == -1) { ACE_ERROR ((LM_ERROR, "%p\n", "recv")); break; } else if (r_bytes == 0) { ACE_DEBUG ((LM_DEBUG, "(%P|%t) reached end of input, connection closed by client\n")); break; } else if (verbose && ACE::write_n (ACE_STDOUT, request, r_bytes) != r_bytes) ACE_ERROR ((LM_ERROR, "%p\n", "ACE::write_n")); else if (stream.send_n (request, r_bytes) != r_bytes) ACE_ERROR ((LM_ERROR, "%p\n", "send_n")); total_bytes += size_t (r_bytes); message_count++; delete [] request; request = 0; } // Close new endpoint (listening endpoint stays open). stream.close (); delete [] request; return 0; }
static int oneway_server (ACE_SSL_SOCK_Stream &stream) { ACE_INET_Addr cli_addr; // Make sure we're not in non-blocking mode. if (stream.disable (ACE_NONBLOCK) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "disable"), 0); else if (stream.get_remote_addr (cli_addr) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "get_remote_addr"), 0); ACE_DEBUG ((LM_DEBUG, "(%P|%t) client %s connected from %d\n", cli_addr.get_host_name (), cli_addr.get_port_number ())); // Timer business ACE_Profile_Timer timer; timer.start (); size_t total_bytes = 0; size_t message_count = 0; char *request = 0; // Read data from client (terminate on error). for (;;) { ACE_INT32 len; ssize_t r_bytes = stream.recv_n ((void *) &len, sizeof (ACE_INT32)); if (r_bytes == -1) { ACE_ERROR ((LM_ERROR, "%p\n", "recv")); break; } else if (r_bytes == 0) { ACE_DEBUG ((LM_DEBUG, "(%P|%t) reached end of input, connection closed by client\n")); break; } else if (r_bytes != sizeof (ACE_INT32)) { ACE_ERROR ((LM_ERROR, "(%P|%t) %p\n", "recv_n failed")); break; } else { len = ntohl (len); ACE_NEW_RETURN (request, char [len], 0); } // Subtract off the sizeof the length prefix. r_bytes = stream.recv_n (request, len - sizeof (ACE_UINT32)); if (r_bytes == -1) { ACE_ERROR ((LM_ERROR, "%p\n", "recv")); break; } else if (r_bytes == 0) { ACE_DEBUG ((LM_DEBUG, "(%P|%t) reached end of input, connection closed by client\n")); break; } else if (verbose && ACE::write_n (ACE_STDOUT, request, r_bytes) != r_bytes) ACE_ERROR ((LM_ERROR, "%p\n", "ACE::write_n")); total_bytes += size_t (r_bytes); message_count++; delete [] request; request = 0; } timer.stop (); ACE_Profile_Timer::ACE_Elapsed_Time et; 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)); double messages_per_sec = double (message_count) / et.real_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\t\tmessages-per-second = %0.00f\n"), message_count, total_bytes, (((double) total_bytes * 8) / et.real_time) / (double) (1024 * 1024), (et.real_time / (double) message_count) * 1000000, messages_per_sec < 0 ? 0 : messages_per_sec)); // Close new endpoint (listening endpoint stays open). stream.close (); delete [] request; return 0; }