<> <> <> <> DIRECTORY IPDefs USING [Byte, Datagram, DByte, Address]; UDP: CEDAR DEFINITIONS = BEGIN Port: TYPE = IPDefs.DByte; default: Port = Port.LAST; echo: Port = 7; discard: Port = 9; date: Port = 13; -- text time: Port = 37; -- 32 bit binary, seconds since Midnight, Jan 1, 1900 domain: Port = 53; minLength: INT = 8; maxLength: INT = minLength+512; PseudoHeader: TYPE = MACHINE DEPENDENT RECORD [ source (0): IPDefs.Address, dest (2): IPDefs.Address, zero (4: 0..7): IPDefs.Byte, protocol (4: 8..15): IPDefs.Byte, udpTotalBytes (5): IPDefs.DByte ]; Body: TYPE = REF BodyRec; BodyRec: TYPE = MACHINE DEPENDENT RECORD [ source (0): Port, dest (1): Port, length (2): IPDefs.DByte, checksum (3): IPDefs.DByte, data (4): DataBuffer ]; DataBuffer: TYPE = PACKED ARRAY INT [minLength..maxLength) OF IPDefs.Byte; Handle: TYPE = REF HandleRec; HandleRec: TYPE = RECORD [ local, remote: Port, him: IPDefs.Address ]; Create: PROC [him: IPDefs.Address, remote: Port, local: Port _ default] RETURNS [Handle]; Destroy: PROC [Handle]; Receive: PROC [handle: Handle, timeout: INT] RETURNS [data: IPDefs.Datagram]; < Forever>> Send: PROC [handle: Handle, data: IPDefs.Datagram, length: INT]; SendReply: PROC [data: IPDefs.Datagram]; END.