summaryrefslogtreecommitdiff
path: root/rpc++/example
diff options
context:
space:
mode:
authorlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1996-10-21 21:41:34 +0000
committerlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1996-10-21 21:41:34 +0000
commita5fdebc5f6375078ec1763850a4ca23ec7fe6458 (patch)
treebcf0a25c3d45a209a6e3ac37b233a4812f29c732 /rpc++/example
downloadATCD-a5fdebc5f6375078ec1763850a4ca23ec7fe6458.tar.gz
Initial revision
Diffstat (limited to 'rpc++/example')
-rw-r--r--rpc++/example/Makefile40
-rw-r--r--rpc++/example/calcsvc.cc30
-rw-r--r--rpc++/example/calcsvc.h34
-rw-r--r--rpc++/example/client.cc64
-rw-r--r--rpc++/example/server.cc112
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 ();
+}