1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
// $Id: CPP-server.cpp 91671 2010-09-08 18:39:23Z johnnyw $
#include "ace/OS_main.h"
#include "ace/ATM_Acceptor.h"
#include "ace/ATM_Addr.h"
#include "ace/High_Res_Timer.h"
#include "ace/Log_Msg.h"
#if defined (ACE_HAS_ATM)
// ACE_ATM Server
int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
//unsigned char selector = ACE_ATM_Addr::DEFAULT_SELECTOR;
//int selector_specified = 0;
if (argc > 2)
ACE_ERROR_RETURN ((LM_ERROR,
"Usage: %s [selector]\n",
argv[0]),
1);
// Create a server address.
ACE_ATM_Addr addr;
//if (selector_specified)
unsigned char selector = ( argc == 2 ) ? ACE_OS::atoi( argv[ 1 ]) : ACE_ATM_Addr::DEFAULT_SELECTOR;
addr.set_selector( selector );
ACE_OS::printf( "ATM_Server: selector changed to %d\n", addr.get_selector());
// Create a server, reuse the addr.
ACE_ATM_Acceptor peer_acceptor;
ACE_ATM_Params params;
// Not sure why but reuse_addr set to true/1 causes problems for
// FORE/XTI/ATM - this is now handled in ACE_ATM_Acceptor::open()
ACE_HANDLE ret = peer_acceptor.open (addr, 5, params);
if ( ret == ACE_INVALID_HANDLE )
ACE_ERROR_RETURN ((LM_ERROR,
"%p\n",
"open"),
-1);
ACE_ATM_Stream new_stream;
ACE_ATM_Addr local_addr;
local_addr.set_selector( selector );
peer_acceptor.get_local_addr( local_addr );
ACE_DEBUG ((LM_DEBUG,
"starting server at address %s\n",
local_addr.addr_to_string ()));
// Performs the iterative server activities
char buf[BUFSIZ];
ACE_High_Res_Timer timer;
int total;
ACE_Time_Value tv;
double real_time;
double actual_rate;
for (;;)
{
// Create a new ACE_ATM_Stream endpoint (note automatic restart
// if errno == EINTR).
ACE_OS::printf( "ATM_Server: expecting clients\n" );
if (peer_acceptor.accept (new_stream,
&addr,
&timeout) == -1)
{
ACE_ERROR ((LM_ERROR,
"%p\n",
"accept"));
continue;
}
ACE_OS::printf( "ATM_Server: got a connection\n" );
ACE_UINT16 vpi, vci;
vpi = vci = 0;
// This has problem on PMP connections on NT
//new_stream.get_vpi_vci(vpi, vci);
ACE_DEBUG ((LM_DEBUG,
"connected to VPI %d VCI %d\n",
vpi, vci));
ACE_OS::printf( "ATM_Server: connection accepted\n" );
ACE_DEBUG ((LM_DEBUG,
"client %s connected\n",
addr.addr_to_string ()));
ACE_DEBUG ((LM_DEBUG,
"client %s connected to host\n",
new_stream.get_peer_name ()));
// Read data from client (terminate on error).
int recvd = 0;
for ( ;; )
{
total = 0;
timer.start_incr();
for (int r_bytes;
(r_bytes = new_stream.recv (buf, sizeof buf, 0)) > 0; )
{
// ACE_OS::printf( "ATM_Server: received %dB\n", r_bytes );
// if (ACE_OS::write (ACE_STDOUT,
// buf,
// r_bytes) != r_bytes)
// ACE_ERROR ((LM_ERROR,
// "%p\n",
// "ACE::send_n"));
total += r_bytes;
if ( total > 10000000 )
break;
}
timer.stop_incr();
timer.elapsed_time_incr( tv );
real_time = tv.sec() * ACE_ONE_SECOND_IN_USECS + tv.usec();
recvd += total;
actual_rate = ( double )recvd * ( double )8 / real_time;
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%t) bytes = %d, usec = %f, rate = %0.00f Mbps\n"),
recvd,
real_time,
actual_rate < 0 ? 0 : actual_rate ));
}
// Close new endpoint (listening endpoint stays open).
if (new_stream.close () == -1)
ACE_ERROR ((LM_ERROR,
"%p\n",
"close"));
}
/* NOTREACHED */
return 0;
}
#else
int ACE_TMAIN (int, ACE_TCHAR *[])
{
ACE_ERROR_RETURN ((LM_ERROR,
"your platform isn't configured to support ATM\n"),
1);
}
#endif /* ACE_HAS_ATM */
|