IdServerIOHandlerSocket.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. Classes,
  62. IdSocketHandle, IdGlobal, IdThread, IdServerIOHandler, IdIOHandler,
  63. IdIOHandlerSocket, IdYarn;
  64. type
  65. TIdIOHandlerSocketClass = class of TIdIOHandlerSocket;
  66. TIdServerIOHandlerSocket = class(TIdServerIOHandler)
  67. protected
  68. IOHandlerSocketClass: TIdIOHandlerSocketClass;
  69. //
  70. public
  71. constructor Create(AOwner: TComponent); override;
  72. function Accept(
  73. ASocket: TIdSocketHandle;
  74. AListenerThread: TIdThread;
  75. AYarn: TIdYarn
  76. ): TIdIOHandler;
  77. override;
  78. procedure Init; override;
  79. end;
  80. implementation
  81. uses
  82. SysUtils;
  83. { TIdServerIOHandlerSocket }
  84. constructor TIdServerIOHandlerSocket.Create(AOwner: TComponent);
  85. begin
  86. inherited Create(AOwner);
  87. IOHandlerSocketClass := TIdIOHandlerSocket;
  88. end;
  89. procedure TIdServerIOHandlerSocket.Init;
  90. begin
  91. //
  92. end;
  93. function TIdServerIOHandlerSocket.Accept(
  94. ASocket: TIdSocketHandle;
  95. AListenerThread: TIdThread;
  96. AYarn: TIdYarn
  97. ): TIdIOHandler;
  98. var
  99. LIOHandler: TIdIOHandlerSocket;
  100. begin
  101. //using a custom scheduler, AYarn may be nil, so don't assert
  102. Assert(ASocket<>nil);
  103. Assert(AListenerThread<>nil);
  104. Result := nil;
  105. LIOHandler := IOHandlerSocketClass.Create(nil);
  106. try
  107. LIOHandler.Open;
  108. while not AListenerThread.Stopped do begin
  109. if ASocket.Select(250) then begin
  110. if (not AListenerThread.Stopped) and LIOHandler.Binding.Accept(ASocket.Handle) then begin
  111. LIOHandler.AfterAccept;
  112. Result := LIOHandler;
  113. LIOHandler := nil;
  114. Break;
  115. end;
  116. end;
  117. end;
  118. finally
  119. LIOHandler.Free;
  120. end;
  121. end;
  122. end.