RPC questions
Jeffrey Heng
cs__sjh at umt.UUCP
Mon Aug 20 06:19:55 AEST 1990
I have run into a problem using broadcast RPC on 386/ix version 2.2,
and NFS 2.1. After a broadcast RPC call, there are several portmappers
running, and the portmapper no longer works correctly.
We're using on a small TCP/IP network consisting of four 386s running
Interactive UNIX 2.2 with NSF and MOTIF.
This problem doesn't occur on a Sun computer.
Has anyone run accross this problem, and know of a workaround? I think
yellow pages uses broadcast RPC without blowing away the portmapper.
Any help or suggestions will be greatly appreciated. Thank you.
Included are sample programs, server and client that illustrates the problem.
After starting server, but before you run client, these commands
will have the following output:
% ps -e | grep portmap
4546 ? 0:00 portmap
%
% rpcinfo -p
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100017 1 tcp 1260 rexd
150001 1 udp 1481 pcnfsd
100005 1 udp 1484 mountd
100003 2 udp 2049 nfs
100024 1 udp 1494 status
100024 1 tcp 1261 status
100020 1 udp 1502 llockmgr
100020 1 tcp 1262 llockmgr
100021 2 tcp 1263 nlockmgr
100021 1 tcp 1265 nlockmgr
100021 1 udp 1511 nlockmg
90 1 udp 1517
90 1 tcp 1270
%
When you run client, you will get the following output:
% client
daemon is running on CAD1
%
Now the ps and rpcinfo commands return:
% ps -e | grep portmap
4546 ? 0:00 portmap
4556 ? 0:00 portmap
4552 ? 0:00 portmap
4553 ? 0:00 portmap
4554 ? 0:00 portmap
4555 ? 0:00 portmap
4557 ? 0:00 portmap
4558 ? 0:00 portmap
4559 ? 0:00 portmap
4560 ? 0:00 portmap
4562 ? 0:00 portmap
%
% rpcinfo -p
rpcinfo: can't contact portmapper: rpcinfo: RPC: Timed out
%
To get things working again, I have to kill all the portmappers,
and restart it. Restarting portmap without killing any portmaps
will not get the system working.
The program server:
#include <stdio.h>
#include <rpc/rpc.h>
#include "daemon.h"
int *
dproc_1(val)
int *val;
{
static int result = 0;
return(&result);
}
The program client:
#include <stdio.h>
#include <netdb.h>
#include <rpc/rpc.h>
#include <rpc/pmap_clnt.h>
#include "daemon.h"
bool_t eachresult() ;
main()
{
int ret;
= 0;
enum clnt_stat clnt_stat;
clnt_stat = clnt_broadcast(DPROG, DVERS, dproc,
xdr_int, &val, xdr_int, &ret, eachresult);
if(clnt_stat != RPC_SUCCESS) {
clnt_perrno(clnt_stat);
}
}
bool_t
eachresult(resultsp, raddr)
caddr_t resultsp;
struct sockaddr_in *raddr;
{
struct hostent *hp;
hp = gethostbyaddr(&raddr->sin_addr, sizeof(struct in_addr),
raddr->sin_family);
printf("daemon is running on %s\n", hp->h_name);
return(1);
}
The rpcgen input file:
program DPROG {
version DVERS {
int dproc(int) = 1;
} = 1;
} = 90;
A makefile:
NETLIBS=-lrpc -linet
all: daemon server client
daemon: daemon.x
rpcgen daemon.x
server: server.o daemon_svc.o daemon.h
cc -o server server.o daemon_svc.o $(NETLIBS)
client: client.o daemon_clnt.o
cc -o client client.o daemon_clnt.o $(NETLIBS)
More information about the Comp.unix.i386
mailing list