[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Symbolics<->Sun Lucid connection?

  | Date: Thu, 14 November 91, 13:10 EST
  | From: Hans Tallis
  | I want to get lisp systems on two machines talking to each other (sending a
  | string of characters is enough; one machine blocks on a wait until the other
  | sends).  One machine is a Symbolics; the other, a Sun/Lucid. Is there a
  | relatively painless way to do this? 
  | (I considered RPC, but don't seem able to find any RPC documentation for Lucid.
  | Is there another way?)
  | --hans
  | tallis@starbase.mitre.org

My *favourite* question. We Sluggers have been through a series of
discussions/fights on this topic. Attached to this message are abstracts
from relevant earlier communications.

Note that pure Lucid offer no RPC library functions, but it's not that
difficult to conjure up your own one. Just use the foreign function
interface and write a few lines of C code. I've done it myself, and it
works well.

There are a couple of traps, though, related to the primitive (but fast)
communication protocol. For instance, you must make sure that your
requests are executed only once by the server (if you need
non-idempotent operations), or else you risk that the execution of your
request times out (by default after ~5 seconds) and is resent by the
client (by default ~5 times) and consequently re-executed if you aren't
prepared to handle this. What you need is to protect the execution of a
request within a "idempotent-protecting" macro, but that too is fairly
straight-forward to implement.

Good luck!


 Eyvind Ness                    Internet Email: eyvind@hrp.no
 Research Scientist             Phone: +47 9 183100
 Control Room Systems Division  Fax: +47 9 187109
 OECD Halden Reactor Project    Surface Mail: P.O. Box 173, N-1751 Halden

(Two "pepperpots" watching TV with a penguin on top of their television set).

- Funny that penguin being there, isn't it? What's he doing there?
- Standing.
- I can see that.
- Perhaps it comes from next door?
- Penguins don't come from next door, they come from the Antarctic.
- Burma!
- Why did you say "Burma"?
- I panicked.

(Monty Python, Penguin sketch).

Here are some earlier messages from related discussions:
From: eyvind%hrp.no@Warbucks.AI.SRI.COM (Eyvind Ness)
To: Slug@ai.sri.com
Cc: svein%skrue.hrp.no@Warbucks.AI.SRI.COM,
Subject: Summary of RPC on Symbolics
Date: Thu, 15 Aug 91 08:32:08 met

Summary of discussion: the Symbolics RPC library.

Q (eyvind@hrp.no): Are there any utilities corresponding to the Sun
RPC library functions CALLRPC and REGISTERRPC available on Symbolics
3600s running Genera 8.0?

A (mainly barmar@think.com): No. For 3600s, Symbolics RPC depends on
the optional IP/TCP and NFS software packages. In Genera 8.1, however,
this is no problem because IP/TCP and NFS are bundled with the


Caveat: Although RPC functionality is unavailable (actually it's
incomplete, which is even worse) on 3600s with Genera 8.0 or older,
all RPC-related functions are documented in the Document Examiner and
in the Networking Manual.

Notes: The programmer interface to Symbolics RPC looks a bit
unfamiliar to Explorer and Unix programmers at first sight. However,
the functionality is the same. Below is a little example showing some
of the differences.

Example: Client stub for calling remotefunction(string) -> string.


  host-name                        ;e.g. "remulus"
  program-number                   ;e.g. #x20abcdef
  version-number                   ;e.g. 1
  procedure-number                 ;e.g. 1
  ;; e.g (defvar query "user-id") and (defvar locf-query (locf query))


  program-name                          ;symbol
  (:number program-number)              ;as above
  (:version version-number)             ;as above
  (:client :lisp))                      ;tells Genera to make client stub

  procedure-name                        ;symbol
  (:number procedure-number)
    (query string))
    (reply string)))

;;; example call:
  (rpc:host-udp-transport-agent (net:parse-host host-name)))

;;; End of example.

======================== End of Message ================================

From: eyvind%hrp.no@Warbucks.AI.SRI.COM (Eyvind Ness)
To: kddlab!atr-la.atr.co.jp!myers@uunet.UU.NET
Cc: eyvind%skrue.hrp.no@Warbucks.AI.SRI.COM, slug@ai.sri.com
Subject: RPC Initialization
Date: Wed, 28 Aug 91 09:21:13 met

   Date: Wed, 28 Aug 91 13:39:48 +0900
   From: kddlab!atr-la.atr.co.jp!myers@uunet.UU.NET (John K. Myers)

   I have three LMs: an XL, a 3620, and a MacIvory.  I want any machine
   to be able to send data to, or run functions remotely on, any other
   specified machine.

   This appears to be a job for RPC.  Based on previous discussions,
   someone suggested I open a connection using
     (setq *LM05-link* (rpc:open-tcp-agent "LM05"))

It is a matter of taste, but personally I think TCP is overkill for RPC
which is a typical connectionless protocol.

   and then use 
     (execute-my-remote-function args more-args :transport-agent *LM05-link*)
   to invoke the RPC, after having gone through the mess of defining    
   the remote-module and the remote-entry.

   The current problem is that I get the following error message:
   Error: LM25 does not support RPC service.

   The following specials have been rebound; use :Show Standard Value Warnings for details:

      Arg 0 (NETI:SERVICE): :RPC
      Arg 1 (NET:HOST): #<FS:LISPM-HOST LM25 22005606115>
      Arg 3 (NETI:MUST-HAVE-ONE): T
   s-A:           Use protocol RPC-LITTLE-ENDER on medium TCP, or RPC on TCP.

   when I try to open the tcp agent.  If I do a s-A, things seem
   to work O.K., but it apparently is using a different protocol than
   TCP (not that I understand nor care).

Is it really? Are you sure?

   Q: How can I get the program to init the RPC behavior without breaking
   out into an error message?  For instance, is there a function that I can
   call directly that sets up a "RPC-LITTLE-ENDER" protocol for me?
   Or is there some magic file that I have to edit to let one Symbolics know
   that another Symbolics has RPC capability?  Or should I use
   (setq *LM25-link* (rpc:open-chaos-agent "LM25"))?

Use the namespace database. Add a new Service attribute for the
machine(s) you want to RPC to. Typically something like (from the top of
my head - the details might be slightly incorrect):

Service: RPC (Medium) TCP (Protocol) RPC-LITTLE-ENDER

The CP command "Add Service to Host" (or something like it) could be
useful too.

   Q: I assume that I can simply call rpc:open-tcp-agent once at the beginning
   of the month, and then have that connection remain valid as long as 
   both machines are running.  Obviously, if I boot the sending machine,
   the connection dies.  What happens if I boot the receiving machine--
   is the connection established from the sending machine still valid?
   What happens if I power-down the MacIvory, and then turn it on again
   (same world)--are connections sent from the Mac still valid?  How about
   connections being received into the Mac?

Typical problems related to connection-oriented transports like TCP. In
my opinion: Use UDP instead and implement the kind of error-handling you
need yourself - it is really not so difficult, at least not in Lisp
under Genera.

   Q: If I use a chaos protocol, can I send strings containing Kanji
   and carriage-returns from one Symbolics to another?  On p.64 of the #13 Networks
   manual, it says that strings should only use the 95 nice printable ASCII characters.
   I couldn't get variable-length "opaque-byte" Kanji strings to work.

I suggest you utilise the Lisp reader (server) and printer (client) to
take care of these petty details. Just make the client send the
neccessary info to enable the server to reconstruct your data structure
at the server side. It might be inefficient, allright, but at least you
don't have to spend the rest of the month (re)inventing some dubious
conventions for transferring data over the net.

Eyvind Ness

In case you've lost it - here is the *standard* RPC set-up (client) on a
Symbolics running Genera 8.1, or 8.0 with TCP/IP and NFS sent out to
slug Aug 15, not the call to RPC:HOST-UDP-TRANSPORT-AGENT:

  program-name                          ;symbol
  (:number program-number)              ;as above
  (:version version-number)             ;as above
  (:client :lisp))                      ;tells Genera to make client stub

  procedure-name                        ;symbol
  (:number procedure-number)
    (query string))
    (reply string)))

;;; example call:
  (rpc:host-udp-transport-agent (net:parse-host host-name)))

;;; End of example.
======================== End of Message ================================