⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idsockethandle.pas

📁 网络控件适用于Delphi6
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence                                   }
{ Team Coherence is Copyright 2002 by Quality Software Components      }
{                                                                      }
{ For further information / comments, visit our WEB site at            }
{ http://www.TeamCoherence.com                                         }
{**********************************************************************}
{}
{ $Log:  56386: IdSocketHandle.pas 
{
{   Rev 1.4    09/06/2004 09:48:42  CCostelloe
{ Kylix 3 patch
}
{
{   Rev 1.3    4/26/04 12:40:26 PM  RLebeau
{ Removed recursion from Readable()
}
{
{   Rev 1.2    2004.03.07 11:48:48 AM  czhower
{ Flushbuffer fix + other minor ones found
}
{
{   Rev 1.1    3/6/2004 5:16:14 PM  JPMugaas
{ Bug 67 fixes.  Do not write to const values.
}
{
{   Rev 1.0    2004.02.03 3:14:40 PM  czhower
{ Move and updates
}
{
{   Rev 1.23    2/2/2004 12:09:16 AM  JPMugaas
{ GetSockOpt should now work in DotNET.
}
{
{   Rev 1.22    2/1/2004 6:10:46 PM  JPMugaas
{ GetSockOpt.
}
{
{   Rev 1.21    12/31/2003 9:51:58 PM  BGooijen
{ Added IPv6 support
}
{
{   Rev 1.20    10/26/2003 12:29:40 PM  BGooijen
{ DotNet
}
{
{   Rev 1.19    10/22/2003 04:40:48 PM  JPMugaas
{ Should compile with some restored functionality.  Still not finished.
}
{
{   Rev 1.18    2003.10.11 5:50:26 PM  czhower
{ -VCL fixes for servers
{ -Chain suport for servers (Super core)
{ -Scheduler upgrades
{ -Full yarn support
}
{
{   Rev 1.17    10/5/2003 9:55:30 PM  BGooijen
{ TIdTCPServer works on D7 and DotNet now
}
{
{   Rev 1.16    2003.10.02 12:44:42 PM  czhower
{ Fix for Bind, Connect
}
{
{   Rev 1.15    2003.10.02 10:16:28 AM  czhower
{ .Net
}
{
{   Rev 1.14    2003.10.01 9:11:20 PM  czhower
{ .Net
}
{
{   Rev 1.13    2003.10.01 5:05:14 PM  czhower
{ .Net
}
{
{   Rev 1.12    2003.10.01 2:30:40 PM  czhower
{ .Net
}
{
{   Rev 1.10    10/1/2003 12:14:12 AM  BGooijen
{ DotNet: removing CheckForSocketError
}
{
{   Rev 1.9    2003.10.01 1:12:36 AM  czhower
{ .Net
}
{
{   Rev 1.8    2003.09.30 1:23:02 PM  czhower
{ Stack split for DotNet
}
{
{   Rev 1.7    20.09.2003 16:33:28  ARybin
{ bug fix:
{ NOT Integer <> 0 is not boolean operation, because:
{ (NOT Integer) = inverted integer
}
{
{   Rev 1.6    2003.07.14 1:57:24 PM  czhower
{ -First set of IOCP fixes.
{ -Fixed a threadsafe problem with the stack class.
}
{
{   Rev 1.5    7/1/2003 05:20:36 PM  JPMugaas
{ Minor optimizations.  Illiminated some unnecessary string operations.
}
{
{   Rev 1.4    7/1/2003 03:39:52 PM  JPMugaas
{ Started numeric IP function API calls for more efficiency.
}
{
    Rev 1.3    5/11/2003 11:59:06 AM  BGooijen
  Added OverLapped property
}
{
    Rev 1.2    5/11/2003 12:35:30 AM  BGooijen
  temporary creates overlapped socked handles
}
{
{   Rev 1.1    3/21/2003 01:50:08 AM  JPMugaas
{ SetBinding method added as per request received in private E-Mail.
}
{
{   Rev 1.0    11/13/2002 08:58:46 AM  JPMugaas
}
unit IdSocketHandle;

interface

uses
  Classes,
  IdException, IdGlobal, IdStackConsts, IdStack;

type
  TIdSocketHandle = class;

  TIdSocketHandles = class(TOwnedCollection)
  protected
    FDefaultPort: TIdPort;
    //
    function GetItem(Index: Integer): TIdSocketHandle;
    procedure SetItem(Index: Integer; const Value: TIdSocketHandle);
  public
    constructor Create(AOwner: TComponent); reintroduce;
    function Add: TIdSocketHandle; reintroduce;
    function BindingByHandle(const AHandle: TIdStackSocketHandle): TIdSocketHandle;
    property Items[Index: Integer]: TIdSocketHandle read GetItem write SetItem; default;
    //
    property DefaultPort: TIdPort read FDefaultPort write FDefaultPort;
  end;

  TIdSocketHandle = class(TCollectionItem)
  protected
    FClientPortMin: Integer;
    FClientPortMax: Integer;
    FHandle: TIdStackSocketHandle;
    FHandleAllocated: Boolean;
    FIP: string;
    FPeerIP: string;
    FPort: TIdPort;
    FPeerPort: TIdPort;
    FReadSocketList: TIdSocketList;
    FOverLapped:boolean;
    FIPVersion: TIdIPVersion;
    //
    function BindPortReserved: Boolean;
    procedure SetOverLapped(const AValue:boolean);
    procedure SetHandle(AHandle: TIdStackSocketHandle);
    procedure SetIPVersion(const Value: TIdIPVersion);
    function TryBind: Boolean;
  public
    function Accept(ASocket: TIdStackSocketHandle): Boolean;
{$IFDEF LINUX}
    procedure AllocateSocket(const ASocketType: TIdSocketType = TIdSocketType(Id_SOCK_STREAM);
     const AProtocol: TIdSocketProtocol = Id_IPPROTO_IP);
{$ELSE}
    procedure AllocateSocket(const ASocketType: TIdSocketType = Id_SOCK_STREAM;
     const AProtocol: TIdSocketProtocol = Id_IPPROTO_IP);
{$ENDIF}
    // Returns True if error was ignored (Matches iIgnore), false if no error occurred
    procedure Assign(Source: TPersistent); override;
    procedure Bind;
    procedure CloseSocket; virtual;
    procedure Connect; virtual;
    constructor Create(ACollection: TCollection); override;
    destructor Destroy; override;
//    procedure GetSockOpt(level, optname: Integer; optval: PChar; optlen: Integer);
    procedure Listen(const anQueueCount: integer = 5);
    function Readable(AMSec: Integer = IdTimeoutDefault): boolean;
    function Receive(var VBuffer: TIdBytes): Integer;
    function RecvFrom(var ABuffer : TIdBytes; var VIP: string;
      var VPort: Integer): Integer;
    procedure Reset(const AResetLocal: boolean = True);
    function Send(
      const ABuffer: TIdBytes;
      AOffset: Integer;
      ASize: Integer = -1
      ): Integer;
    procedure SendTo(const AIP: string; const APort: Integer; const ABuffer : TIdBytes);
    procedure SetPeer(const AIP: string; const APort: TIdPort);
    procedure SetBinding(const AIP: string; const APort: TIdPort);
    procedure GetSockOpt(ALevel:TIdSocketOptionLevel; AOptName: TIdSocketOption; out VOptVal: Integer);
    procedure SetSockOpt(ALevel:TIdSocketOptionLevel; AOptName: TIdSocketOption; AOptVal: Integer);
    function Select(ATimeout: Integer = IdTimeoutInfinite): Boolean;
    procedure UpdateBindingLocal;
    procedure UpdateBindingPeer;
    //
    property HandleAllocated: Boolean read FHandleAllocated;
    property Handle: TIdStackSocketHandle read FHandle;
    property OverLapped:boolean read FOverLapped write SetOverLapped;
    property PeerIP: string read FPeerIP;
    property PeerPort: TIdPort read FPeerPort;
  published
    property ClientPortMin : TIdPort read FClientPortMin write FClientPortMin default 0;
    property ClientPortMax : TIdPort read FClientPortMax write FClientPortMax default 0;
    property IP: string read FIP write FIP;
    property IPVersion: TIdIPVersion read FIPVersion write SetIPVersion default ID_DEFAULT_IP_VERSION;
    property Port: TIdPort read FPort write FPort;
  end;

implementation

uses
  IdAntiFreezeBase, IdComponent, IdResourceStrings,
  SysUtils;

{ TIdSocketHandle }

//procedure TIdSocketHandle.AllocateSocket(
// const ASocketType: TIdSocketType = Id_SOCK_STREAM;
// const AProtocol: TIdSocketProtocol = Id_IPPROTO_IP);
procedure TIdSocketHandle.AllocateSocket(
 const ASocketType: TIdSocketType;
 const AProtocol: TIdSocketProtocol);
begin
  // If we are reallocating a socket - close and destroy the old socket handle
  CloseSocket;
  if HandleAllocated then begin
    Reset;
  end;
  // Set property so it calls the writer
  SetHandle(GStack.NewSocketHandle(ASocketType, AProtocol, FIPVersion ,FOverLapped));
end;

procedure TIdSocketHandle.CloseSocket;
begin
  if HandleAllocated then begin
    // Must be first, closing socket will trigger some errors, and they
    // may then call (in other threads) Connected, which in turn looks at
    // FHandleAllocated.
    FHandleAllocated := False;
    GStack.Disconnect(Handle);
    SetHandle(Id_INVALID_SOCKET);
  end;
end;

procedure TIdSocketHandle.Connect;
begin
  GStack.Connect(Handle, PeerIP, PeerPort, FIPVersion);
  // UpdateBindingLocal needs to be called even though Bind calls it. After
  // Bind is may be 0.0.0.0 (INADDR_ANY). After connect it will be a real IP.
  UpdateBindingLocal;
  //TODO: Could Peer binding ever be other than what we specified above?
  // Need to reread it?
  UpdateBindingPeer;
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -