IdRawBase.pas 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 10289: IdRawBase.pas
  11. {
  12. { Rev 1.0 2002.11.12 10:49:18 PM czhower
  13. }
  14. unit IdRawBase;
  15. interface
  16. uses
  17. Classes,
  18. IdComponent, IdGlobal, IdSocketHandle,
  19. IdStackConsts;
  20. const
  21. Id_TIdRawBase_Port = 0;
  22. Id_TIdRawBase_BufferSize = 8192;
  23. GReceiveTimeout = 0;
  24. GFTTL = 128;
  25. type
  26. TIdRawBase = class(TIdComponent)
  27. protected
  28. FBinding: TIdSocketHandle;
  29. FBuffer: TMemoryStream;
  30. FHost: string;
  31. FPort: integer;
  32. FReceiveTimeout: integer;
  33. FProtocol: integer;
  34. FTTL: Integer;
  35. function GetBinding: TIdSocketHandle;
  36. function GetBufferSize: Integer;
  37. procedure SetBufferSize(const AValue: Integer);
  38. procedure SetTTL(const Value: Integer);
  39. public
  40. constructor Create(AOwner: TComponent); override;
  41. destructor Destroy; override;
  42. property TTL: Integer read FTTL write SetTTL default GFTTL;
  43. property Binding: TIdSocketHandle read GetBinding;
  44. property ReceiveTimeout: integer read FReceiveTimeout write FReceiveTimeout Default GReceiveTimeout;
  45. // TODO: figure out which ReceiveXXX functions we want
  46. function ReceiveBuffer(var ABuffer; const AByteCount: Integer; ATimeOut: integer = -1): integer;
  47. procedure Send(AData: string); overload;
  48. procedure Send(AHost: string; const APort: Integer; AData: string); overload;
  49. procedure Send(AHost: string; const APort: integer; var ABuffer; const ABufferSize: integer); overload;
  50. published
  51. property BufferSize: Integer read GetBufferSize write SetBufferSize default Id_TIdRawBase_BufferSize;
  52. property Host: string read FHost write FHost;
  53. property Port: Integer read FPort write FPort default Id_TIdRawBase_Port;
  54. property Protocol: Integer read FProtocol write FProtocol default Id_IPPROTO_RAW;
  55. end;
  56. implementation
  57. uses
  58. IdResourceStrings, IdStack, SysUtils;
  59. { TIdRawBase }
  60. constructor TIdRawBase.Create(AOwner: TComponent);
  61. begin
  62. inherited;
  63. FBinding := TIdSocketHandle.Create(nil);
  64. BufferSize := Id_TIdRawBase_BufferSize;
  65. ReceiveTimeout := GReceiveTimeout;
  66. FPort := Id_TIdRawBase_Port;
  67. FProtocol := Id_IPPROTO_RAW;
  68. FTTL := GFTTL;
  69. end;
  70. destructor TIdRawBase.Destroy;
  71. begin
  72. FreeAndNil(FBinding);
  73. FreeAndNil(FBuffer);
  74. inherited;
  75. end;
  76. function TIdRawBase.GetBinding: TIdSocketHandle;
  77. begin
  78. if not FBinding.HandleAllocated then begin
  79. FBinding.AllocateSocket(Id_SOCK_RAW, FProtocol);
  80. end;
  81. FBinding.SetSockOpt(Id_IPPROTO_IP, Id_IP_TTL, PChar(@FTTL), SizeOf(FTTL));
  82. Result := FBinding;
  83. end;
  84. function TIdRawBase.GetBufferSize: Integer;
  85. begin
  86. Result := FBuffer.Size;
  87. end;
  88. procedure TIdRawBase.SetBufferSize(const AValue: Integer);
  89. begin
  90. if (FBuffer = nil) then
  91. FBuffer := TMemoryStream.Create;
  92. FBuffer.Size := AValue;
  93. end;
  94. function TIdRawBase.ReceiveBuffer(var ABuffer; const AByteCount: Integer; ATimeOut: integer = -1): integer;
  95. begin
  96. if (AByteCount > 0) and (@ABuffer <> nil) then
  97. begin
  98. // TODO: pass flags to recv()
  99. if ATimeOut < 0 then
  100. ATimeOut := FReceiveTimeout;
  101. if Binding.Readable(ATimeOut) then
  102. Result := Binding.Recv(ABuffer, AByteCount, 0)
  103. else
  104. begin
  105. result := 0;
  106. end;
  107. end
  108. else
  109. result := 0;
  110. end;
  111. procedure TIdRawBase.Send(AHost: string; const APort: Integer; AData: string);
  112. begin
  113. AHost := GStack.ResolveHost(AHost);
  114. Binding.SendTo(AHost, APort, AData[1], Length(AData));
  115. end;
  116. procedure TIdRawBase.Send(AData: string);
  117. begin
  118. Send(Host, Port, AData);
  119. end;
  120. procedure TIdRawBase.Send(AHost: string; const APort: integer; var ABuffer; const ABufferSize: integer);
  121. begin
  122. AHost := GStack.ResolveHost(AHost);
  123. Binding.SendTo(AHost, APort, ABuffer, ABufferSize);
  124. end;
  125. procedure TIdRawBase.SetTTL(const Value: Integer);
  126. var
  127. data: pointer;
  128. begin
  129. FTTL := Value;
  130. Data := @FTTL;
  131. Binding.SetSockOpt(Id_IPPROTO_IP, Id_IP_TTL, PChar(Data), SizeOf(FTTL));
  132. end;
  133. end.