diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1996-10-21 21:41:34 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1996-10-21 21:41:34 +0000 |
commit | a5fdebc5f6375078ec1763850a4ca23ec7fe6458 (patch) | |
tree | bcf0a25c3d45a209a6e3ac37b233a4812f29c732 /rpc++/example | |
download | ATCD-a5fdebc5f6375078ec1763850a4ca23ec7fe6458.tar.gz |
Initial revision
Diffstat (limited to 'rpc++/example')
-rw-r--r-- | rpc++/example/Makefile | 40 | ||||
-rw-r--r-- | rpc++/example/calcsvc.cc | 30 | ||||
-rw-r--r-- | rpc++/example/calcsvc.h | 34 | ||||
-rw-r--r-- | rpc++/example/client.cc | 64 | ||||
-rw-r--r-- | rpc++/example/server.cc | 112 |
5 files changed, 280 insertions, 0 deletions
diff --git a/rpc++/example/Makefile b/rpc++/example/Makefile new file mode 100644 index 00000000000..4abd7b4488f --- /dev/null +++ b/rpc++/example/Makefile @@ -0,0 +1,40 @@ +TOP = .. +SUBDIRS = + +CC = gcc +CPPFLAGS = -I.. +CFLAGS = -ggdb +C++FLAGS = $(CFLAGS) +# for Sun: +#LOADLIBES = -L.. -lrpc++ -lg++ +# for ISC 2.2: +LOADLIBES = -L.. -lrpc++ -lrpclib -lmisc -lg++ -linet -liberty + +HDRS = calcsvc.h +SRCS = server.cc client.cc calcsvc.cc + +all:: server client + +server: server.o calcsvc.o + $(CC) -o $@ server.o calcsvc.o $(LOADLIBES) + +client: client.o calcsvc.o + $(CC) -o $@ client.o calcsvc.o ../request.o $(LOADLIBES) + +DISTLIST = Makefile $(HDRS) $(SRCS) + +clean:: + rm -f $(CLEANWILDCARDS) server client + +include .dependencies + +.dependencies: $(HDRS) $(SRCS) + gcc -M $(CPPFLAGS) $(SRCS) > .dependencies + +distlist:: + @for f in *.[ch] *.cc; do \ + if expr " $(DISTLIST) " : ".* $$f " >/dev/null; then : ; \ + else echo 1>&2 "Warning: c- or h-file \"$$f\" not in DISTLIST"; fi; \ + done + +include $(TOP)/Proj.make diff --git a/rpc++/example/calcsvc.cc b/rpc++/example/calcsvc.cc new file mode 100644 index 00000000000..6ed36594c61 --- /dev/null +++ b/rpc++/example/calcsvc.cc @@ -0,0 +1,30 @@ +// -*- c++ -*- +static char _calcsvc_cc_[] += "calcsvc.cc,v 2.3 1992/06/15 19:13:13 mnl Exp"; + +// calcsvc.cc,v +// Revision 2.3 1992/06/15 19:13:13 mnl +// Fixed a few bugs, clarified interface. +// +// Revision 2.2 1992/06/13 14:27:28 mnl +// Adapted to (patched) gcc-2.2. Fixed several bugs. +// +// Revision 2.1.1.1 1992/03/08 13:28:45 mnl +// Initial mnl version. +// + +#include <stream.h> +#include "calcsvc.h" + +XdrInfo& Xmyint = Xdr::Xint; + +RpcRequest CalcRequests::Add (1, &Xmyint, &Xdr::Xint, &Xdr::Xint); +RpcRequest CalcRequests::Sub (2, &Xdr::Xint, &Xdr::Xint, &Xdr::Xint); +RpcRequest CalcRequests::Times (3, &Xdr::Xint, &Xdr::Xint, &Xdr::Xint); +RpcRequest CalcRequests::Div (4, &Xdr::Xint, &Xdr::Xint, &Xdr::Xint); +RpcRequest CalcRequests::Inc (5, &Xdr::Xint, &Xdr::Xint); +RpcRequest CalcRequests::IToA (6, &Xdr::Xwrapstring, &Xdr::Xint); +RpcRequest CalcRequests::Reset (7, &Xdr::Xvoid); +RpcRequest CalcRequests::Sleep (8, &Xdr::Xnull, &Xdr::Xint, RpcRequest::async); +RpcRequest CalcRequests::Msg (9, &Xdr::Xvoid, &Xdr::Xwrapstring); +RpcRequest CalcRequests::Invalid (100, &Xdr::Xvoid, &Xdr::Xvoid); diff --git a/rpc++/example/calcsvc.h b/rpc++/example/calcsvc.h new file mode 100644 index 00000000000..a70c10fadac --- /dev/null +++ b/rpc++/example/calcsvc.h @@ -0,0 +1,34 @@ +// -*- c++ -*- +#ifndef _CALCSERVICE_H_ +#define _CALCSERVICE_H_ +static char _calcsvc_h_[] += "calcsvc.h,v 2.3 1992/06/15 19:13:15 mnl Exp"; + +// calcsvc.h,v +// Revision 2.3 1992/06/15 19:13:15 mnl +// Fixed a few bugs, clarified interface. +// + +#ifdef __GNUG__ +#pragma interface +#endif + +#include "rpc++/request.h" + +#define CALCSVC 0x20100001 + +struct CalcRequests +{ + static RpcRequest Add; + static RpcRequest Sub; + static RpcRequest Times; + static RpcRequest Div; + static RpcRequest Inc; + static RpcRequest IToA; + static RpcRequest Reset; // for testing proc without args + static RpcRequest Sleep; // for testing async + static RpcRequest Msg; // for testing string passing + static RpcRequest Invalid; // for testing error handling +}; + +#endif diff --git a/rpc++/example/client.cc b/rpc++/example/client.cc new file mode 100644 index 00000000000..f435de61da9 --- /dev/null +++ b/rpc++/example/client.cc @@ -0,0 +1,64 @@ +// -*- c++ -*- +static char _client_cc_[] += "client.cc,v 2.3 1992/06/15 19:13:17 mnl Exp"; + +// client.cc,v +// Revision 2.3 1992/06/15 19:13:17 mnl +// Fixed a few bugs, clarified interface. +// +// Revision 2.2 1992/06/13 14:27:32 mnl +// Adapted to (patched) gcc-2.2. Fixed several bugs. +// +// Revision 2.1.1.1 1992/03/08 13:28:45 mnl +// Initial mnl version. +// + +#include <stream.h> +#include "rpc++/stub.h" + +#include "calcsvc.h" + +class CalcStub : public RpcStub +{ +public: + inline CalcStub (u_long prognum, u_long versnum, + char* hostname = "localhost", + timeval timeout = defaultTimeout, bool connect = TRUE) + : RpcStub (prognum, versnum, hostname, timeout, connect) {} + + inline void Reset () + { Call (CalcRequests::Reset); } + inline int Inc (int i) + { return *(int*)Call (CalcRequests::Inc, &i); } + inline char* IToA (int i) + { return *(char**)Call (CalcRequests::IToA, &i); } + inline int Add (int s1, int s2) + { return *(int*)Call (CalcRequests::Add, &s1, &s2); } + + inline void Msg (char* msg) + { Call (CalcRequests::Msg, &msg); } + inline void Sleep (int secs) + { Call (CalcRequests::Sleep, &secs); } +}; + +main (int argc, char* argv[]) +{ + char* server = argv[1]; + + CalcStub svc (CALCSVC, 1, server); + svc.Reset (); + svc.Msg ("Hello server.\n"); + int i = 0, o; + while (i < 10) + { + o = svc.Inc (i); + cout << svc.IToA (o) << '\n'; + i = o; + } + i = svc.Add (12, 23); + cout << "add (" << 12 << ", " << 23 << ") = " << i << endl; + cout << "Calling Sleep (5) asynchronously.\n"; + svc.Sleep (5); + cout << "Sleep call completed.\n"; + svc.Call (CalcRequests::Invalid); +} diff --git a/rpc++/example/server.cc b/rpc++/example/server.cc new file mode 100644 index 00000000000..f57496c0674 --- /dev/null +++ b/rpc++/example/server.cc @@ -0,0 +1,112 @@ +// -*- c++ -*- +static char _server_cc_[] += "server.cc,v 2.3 1992/06/15 19:13:18 mnl Exp"; + +// server.cc,v +// Revision 2.3 1992/06/15 19:13:18 mnl +// Fixed a few bugs, clarified interface. +// +// Revision 2.2 1992/06/13 14:27:33 mnl +// Adapted to (patched) gcc-2.2. Fixed several bugs. +// +// Revision 2.1.1.1 1992/03/08 13:28:45 mnl +// Initial mnl version. +// + +#include <unistd.h> +#include <stream.h> +#include <string.h> +#include <malloc.h> + +#include "rpc++/service.h" +#include "calcsvc.h" + +class Calc +{ +public: + void* Add (void*, void*); + void* Sub (void*, void*); + void* Times (void*, void*); + void* Div (void*, void*); + void* Inc (void*); + void* IToA (void**); + void Reset (RpcService*); +}; + +void* Calc::Add (void* in1, void* in2) +{ + static int res; + res = *(int*)in1 + *(int*)in2; + return &res; +} + +void* Calc::Sub (void* in1, void* in2) +{ + static int res; + res = *(int*)in1 - *(int*)in2; + return &res; +} + +void* Calc::Times (void* in1, void* in2) +{ + static int res; + res = *(int*)in1 * *(int*)in2; + return &res; +} + +void* Calc::Div (void* in1, void* in2) +{ + static int res; + res = *(int*)in1 / *(int*)in2; + return &res; +} + +void* Calc::Inc (void* in) +{ + static int res; + res = *(int*)in + 1; + return &res; +} + +void* Calc::IToA (void** in) +{ + static char *s = 0; + delete s; + char *t = form ("%d", *(int*)in[0]); + s = new char[strlen (t) + 1]; + strcpy (s, t); + return &s; +} + +void Calc::Reset (RpcService* svc) +{ + cout << "Received reset from " << svc->CallerName () << ".\n"; +} + +void printMessage (void* in) +{ + cout << *(char**)in; +} + +void doSleep (void* in) +{ + cout << form ("Sleeping %d secs.\n", *(int*)in); + sleep (*(int*)in); + cout << "Woke up.\n"; +} + +main () +{ + RpcService svc (CALCSVC, 1); + Calc calc; + svc.Register (CalcRequests::Add, RpcMethodCall<Calc> (&calc, &calc.Add)); + svc.Register (CalcRequests::Sub, RpcMethodCall<Calc> (&calc, &calc.Sub)); + svc.Register (CalcRequests::Times, RpcMethodCall<Calc> (&calc, &calc.Times)); + svc.Register (CalcRequests::Div, RpcMethodCall<Calc> (&calc, &calc.Div)); + svc.Register (CalcRequests::Inc, RpcMethodCall<Calc> (&calc, &calc.Inc)); + svc.Register (CalcRequests::IToA,RpcMethodCall<Calc>(&calc, &calc.IToA)); + svc.Register (CalcRequests::Reset, RpcMethodCall<Calc> (&calc, &calc.Reset)); + svc.Register (CalcRequests::Msg, RpcCallback (printMessage)); + svc.Register (CalcRequests::Sleep, RpcCallback (doSleep)); + svc.Provide (); +} |