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

UDP network communication



    Date: Wed, 8 Jul 1992 12:16 EDT
    From: robin@ciani.den.mmc.com (Robin Kladke (303-977-9670))

    Are there any good example files laying around that would help me put
    together a program to send binary data using UDP to a Sun?  
See the end of this message; this is an example I consed up based on some application
code I wrote a while back.
								I have 3 problems
    i am trying to tackle: (1) setting up the UDP communication, (2) parsing
    incoming binary data into appropriate internal data structures as well as
    structuring outgoing data, and (3) byte-swapping.  I am currently stuck on the
    first and i believe the primary reason to be that there are not many UDP
    examples in the Network manual.  For test purposes, I am using a 3630 and
    XL400 running under Genera 8.1.  Once i get the UDP working between those two,
    i will attempt to communicate between the '30 and a Solbourne running under
    UNIX (actually OS/SMP 4.0D_Export or some such).

    I am including my code along with the sample application i have been using to
    test it.  This code does not worry the binary problem or the byte swapping; it
    just tries to get the machines to talk to each other using UDP.  Some functions
    are defined twice so that i can use the simpler version for testing.

    My primary problem seems to be that the data is not being packaged correctly.
    The starting and ending index of the message received is always 8 and 8.
This sounds like you are not sending any arguments with the data; the array you get
is the real packet; the 8 bytes at the beginning are overhead bytes of the header,
you only get to see the argument bytes that were passed.
    Should i be sending an array?  The few examples do not indicate that.  I have
    tried sending a string and an integer.  Neither gets there.  Should i explicitly
    be sending size information?  

    I want to use the response-array for the ACK.  I didn't find i really needed
    the start and end indices.  Do i really need to set these?
In your code you only set them inside a function, where they were local variables
and were lost.  I used the other option mentioned in the documentation, namely
to return the string I want as an answer and let the system copy it into the array.

;;; -*- Mode: LISP; Syntax: Common-lisp; Package: USER; Base: 10 -*-

#|

Usage is:

(neti:invoke-service-on-host :binary-udp neti:*local-host* "testing")
"what you sent from host WESER was: ->testing<-"

|#

(chaos:add-contact-name-for-protocol :binary-udp)	;for use over CHAOS

(tcp::add-udp-port-for-protocol :binary-udp 501)	;for use over TCP

(neti:define-server :binary-udp (:medium :datagram :simple-p t
					 :host host
					 :request-array (array start limit))
   (stack-let ((request-string
		 (si:make-array (- limit start) :type'si:art-string
				:displaced-to array
				:displaced-index-offset start)))
     (values t
	     (string-append (format nil "what you sent from host ~A was: ->" host)
			    request-string "<-"))))

(neti:define-protocol :binary-udp (:binary-udp :datagram)
  (:desirability .75)
  (:invoke-with-stream-and-close
    ((stream
       :rfc-data (first (neti:service-access-path-args neti:.service.)))
     request)
    (binary-udp-simple stream request)))

(defun binary-udp-simple (stream request)
  (ignore request)
  (multiple-value-bind (buffer start limit)
      (send stream :read-input-buffer)
    (stack-let*
      ((size (- limit start))
       (stack-string
	 (si:make-array size :type'si:art-string :displaced-to
			buffer :displaced-index-offset start)))
      (si:copy-if-necessary stack-string))))