Using NS3000/iX Network Services (36920-90008)

158 Chapter 7
Remote Process Management
RPM Program 2
begin {creature}
{get the creator process's socket name and node name, one at a time, from
the rpmstrings}
rpmstringlen:= maxname;
rpmgetstring (socketname, rpmstringlen, result);
socknmlen := rpmstringlen;
strmove (socknmlen, socketname, 1, strdata, 1);
rpmstringlen := maxloc;
rpmgetstring (nodename, rpmstringlen, result);
nodenmlen := rpmstringlen;
setstrlen(strdata,0);
strmove(nodenmlen, nodename, 1, strdata, 1);
{look up socket name to get destination descriptor}
ipclookup (socketname,socknmlen,nodename,nodenmlen,,destdesc, , ,result);
check (result); {error procedure}
{create a call socket for this process}
ipccreate (3, 4, , , calldesc, result); {call socket, TCP protocol}
check (result);
{send a connection request to the creator process and receive the creator's
reply to complete the connection}
ipcconnect (calldesc, destdesc, , , vcdesc, result);
check (result);
ipcrecv (vcdesc, , , , ,result);
check (result);
ipcshutdown (alldesc);
ipcshutdown (destdesc);
{send messages on connection}
{ prompt for messages and send them }
reset(datafile); {open input file}
while not EOF(datafile) do
begin
setstrlen(strdata, 0);
readln(datafile, strdata); {read message}
data.len := strlen(strdata); {store message length}
strmove(data.len, strdata, 1, data.msg, 1); {store message}
ipcsend(vcdesc, data, data.len+2, , , result); {send message,
including length
as first 2 bytes}
check(result); {failed}
end;
{connection shutdown procedure}
data.len := 3;
data.msg := 'END'; {termination request}
ipcsend(vcdesc, data, 5, , , result);
check(result);
y_len := 1;
ipcrecv (vcdesc, y_data, y_len, , , result);
if (y_data = 'Y') and (result = 0)
then ipcshutdown(vcdesc)
else
check(result);
end. {creature}