<> <> <> DIRECTORY BufferDefs USING [OisBuffer], CommunicationInternal USING [], CommFlags USING [doStats], Echo USING [echoRequest, echoResponse], OISCP USING [ReturnFreeOisBuffer, unknownNetID], OISCPConstants USING [echoerSocket], Router USING [FindMyHostID], Socket USING [Abort, ChannelAborted, Create, Delete, GetPacket, PutPacket, SetWaitTime, TimeOut, TransferStatus, WaitTime], SocketInternal USING [SocketObject], NSAddress USING [NetworkAddress], StatsDefs USING [StatIncr, StatBump]; EchoServerImpl: PROGRAM IMPORTS OISCP, Router, Socket, StatsDefs EXPORTS CommunicationInternal, Echo, Socket SHARES BufferDefs = BEGIN <> NetworkAddress: PUBLIC TYPE = NSAddress.NetworkAddress; ChannelHandle: TYPE = REF ChannelObject; ChannelObject: PUBLIC TYPE = SocketInternal.SocketObject; <> nBuffers: CARDINAL = 2; <> cH: ChannelHandle; localAddr: NetworkAddress; echoServerFork: PROCESS; echoerTimeout: Socket.WaitTime = 7777777777B; -- in msec (about 10 days) <> <> CreateServer: PUBLIC PROCEDURE = BEGIN localAddr _ [net: OISCP.unknownNetID, host: Router.FindMyHostID[], socket: OISCPConstants.echoerSocket]; cH _ Socket.Create[localAddr, 0, nBuffers, 0, FALSE]; < share buffers from system pool.>> echoServerFork _ FORK EchoServer[]; END; -- CreateServer <> DeleteServer: PUBLIC PROCEDURE = BEGIN Socket.Abort[cH]; JOIN echoServerFork; Socket.Delete[cH]; END; <> <> <> EchoServer: PROCEDURE = BEGIN buf: BufferDefs.OisBuffer; Socket.SetWaitTime[cH, echoerTimeout]; <> DO <> buf _ NIL; buf _ Socket.GetPacket[ cH ! Socket.TimeOut => RETRY; Socket.ChannelAborted => EXIT]; <> SELECT LOOPHOLE[buf.status, Socket.TransferStatus] FROM goodCompletion => BEGIN IF buf.ois.transCntlAndPktTp.packetType = echo THEN BEGIN firstWord: LONG POINTER TO WORD _ @buf.ois.oisWords[0]; <> IF firstWord^ = Echo.echoRequest THEN BEGIN <> buf.ois.destination _ buf.ois.source; firstWord^ _ Echo.echoResponse; IF CommFlags.doStats THEN StatsDefs.StatIncr[packetsEchoed]; IF CommFlags.doStats THEN StatsDefs.StatBump[bytesEchoed, buf.ois.pktLength]; Socket.PutPacket[cH, buf ! Socket.ChannelAborted => BEGIN OISCP.ReturnFreeOisBuffer[buf]; EXIT; END]; LOOP; END ELSE IF CommFlags.doStats THEN StatsDefs.StatIncr[packetsBadEchoed] END ELSE IF CommFlags.doStats THEN StatsDefs.StatIncr[packetsBadEchoed]; END; -- end goodCompletion aborted => EXIT; ENDCASE => NULL; OISCP.ReturnFreeOisBuffer[buf]; ENDLOOP; <> Socket.Abort[cH]; END; -- EchoServer END.