Running RPC under Unix
See also: Building an application under unix, Installing RPC under
unix .
Under Berkley unix, DEC Ultrix or equivalent, the RPC system can communicate
over TCP/IP. For raw ethernet or RS232 (v24) working, routines to
send and receive packets (characters) would have to be written for
your system. TCP is recommended. See the section on TCP for details
of addressing. The shell environment (see setenv, printenv commands)
is used to define rpc addresses. The RPC compiler is available to
run in these environments.
Support in this environment is currently for C compatible software,
FORTRAN can be made be avialable if required. The stubs should be
generated using GenericC or FORTRAN options of the compiler, and then
compiled using the resident C compiler. They must be linked with the
rpclib.o module and rpc_rts_for if in FORTRAN.
The stubs must be initialised (See Initialization ) by calls to open_xxx
and attach_xxx in the client and server programs respectively.
Defining addresses
See the earlier sections in this chapter for the format of RPC addreses.
The setenv command must be used (under csh) or and equate (a=b) syntax
under the shell 'sh'. For example,
setenv TESTPACKAGE CERNVAX:777.TCP
setenv RPC_CLIENT_NAME '*:777.TCP'
Note that in the last example, the single quotes were necessary to
stop the shell interpreting the "*" character.
Example
Imagine we have written a file server called "FILER". The interface
is described by a file "filer.rpc". The simple IN variables are passed
by value as in normal in C. The client application program is called
myclient.c and the filer server itself is filer.c.
First, we generate the server program. Here, filer.c contains a simple
main program which calls attach_filer() to initialise the stub, and
then rpc_loop_server(..) to run the server. It also, of course, contains
the file access routines themselves.
rpcc -sgenericc=filer_server_stub.c -byvalue filer.rpc
cc -o filer filer.c filer_server_stub.c rpcrts.o ts.o
chmod +x filer
Next, we generate the client. The client in this example has a call
to open_filer() before it uses any remote routines.
rpcc -cgenericc=filer_client_stub.c -byvalue filer.rpc
cc -o myclient myclient.c filer_client_stub.c rpcrts.o ts.o
chmod +x myclient
Now we run the server, asking it to wait for any connections to TCP
port 1789:
setenv RPC_CLIENT_NAME '*:1789.TCP'
filer &
We can leave that running and go start the client:
setenv FILER mynode:1789.TCP
myclient
where mynode is the internet name of the node on which the server
is running. Here, the port number was chosen to be random but greater
than 1024. See the section on TCP addressing.
Diagnostic trace output
If there is a problem, the RPC sytem will normally print an error
message. If this is insufficient to determine what has gone wrong,
then the same program may be run with the runtime trace turned on.
This is done by setting the environment variable RPC_TRACE_FLAG to
the name of the file to be used. For example,
setenv RPC_TRACE_FLAG rpc.trace
or
setenv RPC_TRACE_FLAG /dev/tty
Trace information will be appended to the given file. To turn the
trace back off, the command is
unsetenv RPC_TRACE_FLAG
(Don't use setenv RPC_TRACE_FLAG /dev/null which will just slow down
the RPC system to no purpose)