<<>> <> <> <> <> <> <> DIRECTORY Arpa USING [Address], ArpaUDP USING [nullPort, Port], Basics USING [UnsafeBlock] ; DatagramSocket: CEDAR DEFINITIONS ~ { <> Handle: TYPE ~ REF Object; Object: TYPE; waitForever: CARD ~ CARD.LAST; <> Create: PROC [localPort: ArpaUDP.Port ¬ ArpaUDP.nullPort] RETURNS [Handle]; <> <> <> <> <> <> GetLocal: PROC [h: Handle] RETURNS [address: Arpa.Address, port: ArpaUDP.Port]; <> <> GetMaxDatagramSize: PROC [h: Handle] RETURNS [maxBytes: CARD]; <= 1KB. It is likely, but not guaranteed, to be the same for all handles.>> <> Destroy: PROC [h: Handle]; <> <> Send: PROC [h: Handle, toAddress: Arpa.Address, toPort: ArpaUDP.Port, b: REF TEXT, startIndex: NAT ¬ 0, count: NAT ¬ NAT.LAST]; <> <> <> UnsafeSend: UNSAFE PROC [h: Handle, toAddress: Arpa.Address, toPort: ArpaUDP.Port, b: Basics.UnsafeBlock]; <> <> Recv: PROC [h: Handle, b: REF TEXT, startIndex: NAT ¬ 0, count: NAT ¬ NAT.LAST, timeoutMsec: CARD ¬ waitForever] RETURNS [nBytesRead: NAT, fromAddress: Arpa.Address, fromPort: ArpaUDP.Port]; <> <= b.maxLength.>> <> UnsafeRecv: UNSAFE PROC [h: Handle, b: Basics.UnsafeBlock, timeoutMsec: CARD ¬ CARD.LAST] RETURNS [nBytesRead: INT, fromAddress: Arpa.Address, fromPort: ArpaUDP.Port]; <> < b.count.>> <> Kick: PROC [h: Handle]; <> <> Error: ERROR [code: ATOM]; <<$timeout => timeout on Recv>> <<$unreachable>> <<$transientError>> <<$portInUse>> <<$datagramTooShort>> <<$datagramTooLong>> <<$invalidBuffer>> <<$handleDestroyed>> <<. . .>> }.