TestServer.Mod 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. (* Aos, Copyright 2001, Pieter Muller, ETH Zurich *)
  2. MODULE TestServer; (** AUTHOR "pjm"; PURPOSE "TCP test server (echo, discard, chargen, daytime)"; *)
  3. (* TCP Echo (RFC 862), Discard (RFC 863), Daytime (RFC 867) and Chargen (RFC 864) services for Aos. *)
  4. IMPORT Modules, KernelLog, TCP, TCPServices, Streams, Clock;
  5. CONST
  6. EchoPort = 7;
  7. EchoBufSize = 4096;
  8. DiscardPort = 9;
  9. DiscardBufSize = 4096;
  10. ChargenPort = 19;
  11. ChargenFirstChar = 32; ChargenNumChars = 95;
  12. ChargenLineLength = 72; ChargenLineSize = 74;
  13. CharGenBufSize = ChargenLineSize * ChargenNumChars;
  14. DayTimePort = 13;
  15. Ok = TCP.Ok;
  16. Trace = TRUE;
  17. TYPE
  18. DiscardAgent = OBJECT (TCPServices.Agent)
  19. VAR len: LONGINT; res: WORD; buf: ARRAY DiscardBufSize OF CHAR;
  20. BEGIN {ACTIVE}
  21. REPEAT
  22. client.Receive(buf, 0, LEN(buf), LEN(buf), len, res)
  23. UNTIL res # Ok;
  24. IF Trace THEN
  25. KernelLog.Enter; KernelLog.String("Discard result "); KernelLog.Int(res, 1); KernelLog.Exit
  26. END;
  27. Terminate
  28. END DiscardAgent;
  29. TYPE
  30. EchoAgent = OBJECT (TCPServices.Agent)
  31. VAR len: LONGINT; res: WORD; buf: ARRAY EchoBufSize OF CHAR;
  32. BEGIN {ACTIVE}
  33. LOOP
  34. client.Receive(buf, 0, LEN(buf), 1, len, res);
  35. IF res # Ok THEN EXIT END;
  36. client.Send(buf, 0, len, FALSE, res);
  37. IF res # Ok THEN EXIT END
  38. END;
  39. IF Trace THEN
  40. KernelLog.Enter; KernelLog.String("Echo result "); KernelLog.Int(res, 1); KernelLog.Exit
  41. END;
  42. Terminate
  43. END EchoAgent;
  44. TYPE
  45. ChargenAgent = OBJECT (TCPServices.Agent)
  46. VAR res: WORD;
  47. BEGIN {ACTIVE}
  48. LOOP
  49. client.Send(chargenbuf^, 0, CharGenBufSize, FALSE, res);
  50. IF res # Ok THEN EXIT END
  51. END;
  52. IF Trace THEN
  53. KernelLog.Enter; KernelLog.String("Chargen result "); KernelLog.Int(res, 1); KernelLog.Exit
  54. END;
  55. Terminate
  56. END ChargenAgent;
  57. TYPE
  58. DayTimeAgent = OBJECT (TCPServices.Agent)
  59. VAR time, date: LONGINT; w: Streams.Writer;
  60. BEGIN {ACTIVE}
  61. Streams.OpenWriter(w, client.Send);
  62. Clock.Get(time, date);
  63. w.Date822(time, date, Clock.tz);
  64. w.Ln;
  65. w.Update;
  66. Terminate
  67. END DayTimeAgent;
  68. VAR
  69. discard, echo, chargen, daytime: TCPServices.Service;
  70. chargenbuf: POINTER TO ARRAY CharGenBufSize OF CHAR;
  71. PROCEDURE InitChargenBuf;
  72. VAR i, j, k: LONGINT;
  73. BEGIN
  74. k := 0; NEW(chargenbuf);
  75. FOR i := 1 TO ChargenNumChars DO
  76. FOR j := 0 TO ChargenLineLength-1 DO
  77. chargenbuf[k] := CHR(ChargenFirstChar + (i+j) MOD ChargenNumChars); INC(k)
  78. END;
  79. chargenbuf[k] := 0DX; chargenbuf[k+1] := 0AX; INC(k, 2)
  80. END;
  81. ASSERT(k = CharGenBufSize)
  82. END InitChargenBuf;
  83. PROCEDURE Open*;
  84. VAR res : WORD;
  85. BEGIN
  86. NEW(discard, DiscardPort, NewDiscardAgent, res);
  87. NEW(echo, EchoPort, NewEchoAgent, res);
  88. NEW(chargen, ChargenPort, NewChargenAgent, res);
  89. NEW(daytime, DayTimePort, NewDayTimeAgent, res);
  90. END Open;
  91. PROCEDURE Close*;
  92. BEGIN
  93. discard.Stop; discard := NIL;
  94. echo.Stop; echo := NIL;
  95. chargen.Stop; chargen := NIL;
  96. daytime.Stop; daytime := NIL;
  97. END Close;
  98. PROCEDURE NewDiscardAgent(c: TCP.Connection; s: TCPServices.Service): TCPServices.Agent;
  99. VAR a: DiscardAgent;
  100. BEGIN
  101. NEW(a, c, s); RETURN a
  102. END NewDiscardAgent;
  103. PROCEDURE NewEchoAgent(c: TCP.Connection; s: TCPServices.Service): TCPServices.Agent;
  104. VAR a: EchoAgent;
  105. BEGIN
  106. NEW(a, c, s); RETURN a
  107. END NewEchoAgent;
  108. PROCEDURE NewChargenAgent(c: TCP.Connection; s: TCPServices.Service): TCPServices.Agent;
  109. VAR a: ChargenAgent;
  110. BEGIN
  111. NEW(a, c, s); RETURN a
  112. END NewChargenAgent;
  113. PROCEDURE NewDayTimeAgent(c: TCP.Connection; s: TCPServices.Service): TCPServices.Agent;
  114. VAR a: DayTimeAgent;
  115. BEGIN
  116. NEW(a, c, s); RETURN a
  117. END NewDayTimeAgent;
  118. PROCEDURE Cleanup;
  119. BEGIN
  120. Close;
  121. END Cleanup;
  122. BEGIN
  123. InitChargenBuf;
  124. discard := NIL; echo := NIL; chargen := NIL; daytime := NIL;
  125. Modules.InstallTermHandler(Cleanup) (* there is still a race with System.Free *)
  126. END TestServer.
  127. System.Free TestServer ~
  128. System.OpenKernelLog
  129. Aos.Call TestServer.Open
  130. Aos.Call TestServer.Close