IdServerIOHandlerSocket.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. {
  2. $Project$
  3. $Workfile$
  4. $Revision$
  5. $DateUTC$
  6. $Id$
  7. This file is part of the Indy (Internet Direct) project, and is offered
  8. under the dual-licensing agreement described on the Indy website.
  9. (http://www.indyproject.org/)
  10. Copyright:
  11. (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
  12. }
  13. {
  14. $Log$
  15. }
  16. {
  17. Rev 1.16 23.3.2005 ã. 20:52:00 DBondzhev
  18. LIOHandler is not released if exception is thrown while listening for
  19. incomming connection.
  20. Rev 1.15 2004.02.03 4:17:04 PM czhower
  21. For unit name changes.
  22. Rev 1.14 2004.01.20 10:03:32 PM czhower
  23. InitComponent
  24. Rev 1.13 2003.10.11 5:50:00 PM czhower
  25. -VCL fixes for servers
  26. -Chain suport for servers (Super core)
  27. -Scheduler upgrades
  28. -Full yarn support
  29. Rev 1.12 10/5/2003 03:03:58 AM JPMugaas
  30. Should compile.
  31. Rev 1.11 2003.09.19 10:11:20 PM czhower
  32. Next stage of fiber support in servers.
  33. Rev 1.10 2003.09.19 11:54:34 AM czhower
  34. -Completed more features necessary for servers
  35. -Fixed some bugs
  36. Rev 1.9 2003.09.18 4:10:28 PM czhower
  37. Preliminary changes for Yarn support.
  38. Rev 1.8 2003.07.14 10:15:36 PM czhower
  39. Changed timeout to 250 from 100
  40. Rev 1.7 3/29/2003 5:55:02 PM BGooijen
  41. now calls AfterAccept
  42. Rev 1.6 3/13/2003 10:18:28 AM BGooijen
  43. Server side fibers, bug fixes
  44. Rev 1.5 1-17-2003 22:22:04 BGooijen
  45. new design
  46. Rev 1.4 1-1-2003 16:28:26 BGooijen
  47. Changed TIdThread to TIdYarn
  48. Rev 1.3 12-7-2002 17:02:32 BGooijen
  49. Now creates IOHandlerSockets of class IOHandlerSocketClass.
  50. This is more flexible for descendants
  51. Rev 1.2 12-7-2002 12:34:38 BGooijen
  52. Re-enabled IPv6 support
  53. Rev 1.1 05/12/2002 15:32:00 AO'Neill
  54. Rev 1.0 12/2/2002 05:01:30 PM JPMugaas
  55. Rechecked in due to file corruption.
  56. }
  57. unit IdServerIOHandlerSocket;
  58. interface
  59. {$i IdCompilerDefines.inc}
  60. uses
  61. IdSocketHandle, IdGlobal, IdThread, IdServerIOHandler, IdStackConsts, IdIOHandler, IdScheduler,
  62. IdIOHandlerSocket, IdYarn;
  63. type
  64. TIdIOHandlerSocketClass = class of TIdIOHandlerSocket;
  65. TIdServerIOHandlerSocket = class(TIdServerIOHandler)
  66. protected
  67. IOHandlerSocketClass: TIdIOHandlerSocketClass;
  68. //
  69. procedure InitComponent; override;
  70. public
  71. function Accept(
  72. ASocket: TIdSocketHandle;
  73. AListenerThread: TIdThread;
  74. AYarn: TIdYarn
  75. ): TIdIOHandler;
  76. override;
  77. procedure Init; override;
  78. end;
  79. implementation
  80. uses SysUtils;
  81. { TIdServerIOHandlerSocket }
  82. procedure TIdServerIOHandlerSocket.Init;
  83. begin
  84. //
  85. end;
  86. function TIdServerIOHandlerSocket.Accept(
  87. ASocket: TIdSocketHandle;
  88. AListenerThread: TIdThread;
  89. AYarn: TIdYarn
  90. ): TIdIOHandler;
  91. var
  92. LIOHandler: TIdIOHandlerSocket;
  93. begin
  94. //using a custom scheduler, AYarn may be nil, so don't assert
  95. Assert(ASocket<>nil);
  96. Assert(AListenerThread<>nil);
  97. Result := nil;
  98. LIOHandler := IOHandlerSocketClass.Create(nil);
  99. try
  100. LIOHandler.Open;
  101. while not AListenerThread.Stopped do begin
  102. if ASocket.Select(250) then begin
  103. if (not AListenerThread.Stopped) and LIOHandler.Binding.Accept(ASocket.Handle) then begin
  104. LIOHandler.AfterAccept;
  105. Result := LIOHandler;
  106. LIOHandler := nil;
  107. Break;
  108. end;
  109. end;
  110. end;
  111. finally
  112. FreeAndNil(LIOHandler);
  113. end;
  114. end;
  115. procedure TIdServerIOHandlerSocket.InitComponent;
  116. begin
  117. inherited InitComponent;
  118. IOHandlerSocketClass := TIdIOHandlerSocket;
  119. end;
  120. end.