testipc_server.pp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. program testipc_server;
  2. {$MODE ObjFPC}
  3. {$H+}
  4. uses
  5. Classes, SysUtils, AdvancedIPC;
  6. const
  7. STRINGMESSAGE_WANTS_RESPONSE = 3;
  8. STRINGMESSAGE_NO_RESPONSE = 2;
  9. MESSAGE_STOP = 4;
  10. var
  11. xServer: TIPCServer;
  12. xStream, xResponseStream: TStringStream;
  13. xMsgID: Integer;
  14. xMsgType: TMessageType;
  15. xNotRunningMessagesCount: Integer;
  16. begin
  17. xServer := nil;
  18. xStream := nil;
  19. xResponseStream := nil;
  20. try
  21. xStream := TStringStream.Create('');
  22. xResponseStream := TStringStream.Create('OK');
  23. //first get all messages from the hello server
  24. xServer := TIPCServer.Create(nil);
  25. xServer.ServerID := 'hello';
  26. xServer.StartServer;
  27. WriteLn('Server ', xServer.ServerID, ' started.');
  28. WriteLn('-----');
  29. while True do
  30. begin
  31. if xServer.PeekRequest(xMsgID{%H-}, xMsgType{%H-}) then
  32. begin
  33. case xMsgType of
  34. STRINGMESSAGE_WANTS_RESPONSE, STRINGMESSAGE_NO_RESPONSE:
  35. begin
  36. xServer.ReadRequest(xMsgID, xStream);
  37. WriteLn('Received string message:');
  38. WriteLn(xStream.DataString);
  39. if xMsgType = STRINGMESSAGE_WANTS_RESPONSE then
  40. begin
  41. xResponseStream.Position := 0;
  42. xServer.PostResponse(xMsgID, STRINGMESSAGE_NO_RESPONSE, xResponseStream);
  43. WriteLn('Posting response.');
  44. end;
  45. WriteLn('-----');
  46. end;
  47. MESSAGE_STOP:
  48. begin
  49. WriteLn('Stopping '+xServer.ServerID+' server.');
  50. WriteLn('-----');
  51. Break;
  52. end;
  53. end;
  54. end else
  55. Sleep(50);
  56. end;
  57. FreeAndNil(xServer);
  58. //now try to get all unhandled messages from the not_running server
  59. //please see that the messages are not peeked in the order they have been posted (this is correct/designed behavior).
  60. xServer := TIPCServer.Create(nil);
  61. xServer.ServerID := 'not_running';
  62. xServer.StartServer(False);
  63. WriteLn('');
  64. WriteLn('Server ', xServer.ServerID, ' started.');
  65. WriteLn('-----');
  66. xNotRunningMessagesCount := 0;
  67. while xServer.PeekRequest(xStream, xMsgID, xMsgType) do
  68. begin
  69. if xMsgType = STRINGMESSAGE_NO_RESPONSE then
  70. begin
  71. WriteLn('Received message: ', xStream.DataString);
  72. Inc(xNotRunningMessagesCount);
  73. end else
  74. WriteLn('ERROR: Wrong message type: ', xMsgType);
  75. WriteLn('-----');
  76. end;
  77. if xNotRunningMessagesCount <> 10 then
  78. begin
  79. WriteLn('ERROR: Wrong message count: ', xNotRunningMessagesCount);
  80. WriteLn('-----');
  81. end;
  82. WriteLn('Stopping '+xServer.ServerID+' server.');
  83. WriteLn('-----');
  84. FreeAndNil(xServer);
  85. finally
  86. xServer.Free;
  87. xStream.Free;
  88. xResponseStream.Free;
  89. end;
  90. end.