This file describes how to invoke the Reactor client/server tests in
the $ACE_ROOT/tests/Reactor/{client,server} directories.

These tests exercise all of the IPC_SAP communication mechanisms, the
Reactor event demultiplexor, and the Service Configurator dynamic
service configuration framework.  To gain a deeper understanding of
what is going on, you should read the IPC_SAP.ps, reactor-[1-3].ps,
and service_configurator.ps papers available for anonymous ftp from
ics.uci.edu in the ftp/gnu/C++_wrappers_doc.tar.Za[a-c] files.

The key to running the Reactor client/server tests is to understand
the purpose of the svc.conf file located in the
$ACE_ROOT/tests/Reactor/server directory.  This file contains a
list of services that may be dynamically configured into a the address
space of a network daemon process.  If you look at the example
svc.conf file included in the Reactor tests you'll see that most of
the entries are commented out (the comment symbol is the '#', which is
an "ignore until end-of-line comment" with the same semantics as the
UNIX C and Bourne shells).  Before reading any further, take a look at
this svc.conf file with your favorite editor or file browser.

There are several types of entries in this file.  The two most
important are the lines beginning with the keywords "static" and
"dynamic".  For example, the first non-commented line says:

static ACE_Service_Manager "-d -p 3911"

When this line is parsed at startup time by the Service Configurator
object in the ./server_test executable, it causes the pre-configured
Svc_Manager object to be initialized with an "argv" argument of "-d -p
3911."  This results in TCP port 3911 being created to listen
connection requests from clients.  To see how this works do the
following:

1. Comment out all the other lines except 

static Svc_Manager "-d -p 3911"

   in the svc.conf file

2. Start up the ./server_test executable in one window, as follows:

	% ./server_test -d

3. Make another window on the *same* host and cd to the ../client
   directory 

4. Run the ./remote_service_directory_test program as follows:

	% ./remote_service_directory_test -p 3911 -h localhost

If everything has been compiled and initialized correctly, you should
get the following message:

	Svc_Manager 3911/tcp # lists all services in the daemon

This message is telling you that the Svc_Manager is currently the only
service that is active within the ./server_test program.  To configure
and activate another service dynamically, perform the following steps:

1. *Without* shutting down the ./server_test program, edit the svc.conf
   file.  Comment out the Svc_Manager line by adding a '#' at the front, i.e.:

# static Svc_Manager "-d -p 3911"

   and then uncomment the second line:

dynamic Remote_Brdcast Service_Object * .obj/Handle_Broadcast.so:remote_broadcast "-p 10001"

2. Send the SIGHUP signal to the process running the ./server_test program
   (use "ps -gux" on SunOS 4.x or "ps -elf" on SunOS 5.x to find the
   correct process id).  This will cause the ./server_test program to
   reconfigure itself based on the new contents of the svc.conf file.
   After reconfiguration, you'll now have a second active service in
   the address space of the ./server_test daemon.  To see this, rerun
   the remote_service_directory_test command, e.g.:

	% ./remote_service_directory_test -p 3911 -h localhost

   You should now see the following output:
   
	Svc_Manager 3911/tcp # lists all services in the daemon
	Remote_Brdcast 10001/udp # tests broadcasting
   
   which indicates that the remote broadcast service is now active.

3. To test the remote broadcast service, run the following program
   in the ../client directory:

	% ./broadcast_client_test -p 10001

   This should cause the window running the ./server_test to 
   display the following output:

	received broadcast datagram from host spare.ics.uci.edu
	----------------------------------------
	testing socket broadcast service
	----------------------------------------

If you want to run other tests, using other configurations, simply
uncomment the appropriate lines in the svc.conf file and experiment
with the corresponding test drivers in the ../client directory.  All
the source code is available so once you get the hang of what is
happening, you might want to take a look at how it is all implemented.
I think you'll be surprised at how much of the ACE framework code is
reused for each different service.  Moreover, writing a new service is
often simply a matter of copying an existing file and filling in the
behavior of some of the methods (e.g., the handle_input() method and
the init() method).

The service_configurator.ps paper and the ACE.ps paper describe the
details of the Service Configurator framework.
