亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? clsocket.pas

?? Clever_Internet_Suite_6.2的代碼 Clever_Internet_Suite_6.2的代碼 Clever_Internet_Suite_6.2的代碼
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
{
  Clever Internet Suite Version 6.2
  Copyright (C) 1999 - 2006 Clever Components
  www.CleverComponents.com
}

unit clSocket;

interface

{$I clVer.inc}
{$IFDEF DELPHI7}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
{$ENDIF}

uses
  Classes, SysUtils, Windows, WinSock, Messages, clWinSock2;

type
  TclSocketProgress64Event = procedure(Sender: TObject; ABytesProceed, ATotalBytes: Int64) of object;
  TclSocketProgressEvent = procedure(Sender: TObject; ABytesProceed, ATotalBytes: Integer) of object;

  EclSocketError = class(Exception)
  private
    FErrorCode: Integer;
  public
    constructor Create(const AErrorMsg: string; AErrorCode: Integer);
    property ErrorCode: Integer read FErrorCode;
  end;

  TclNetworkStreamAction = (saNone, saRead, saWrite);
  
  TclConnection = class;

  TclNetworkStream = class
  private
    FConnection: TclConnection;
    FSleepEvent: THandle;
    FNextAction: TclNetworkStreamAction;
    FListenPort: Integer;
    FPeerName: string;
    FPeerIP: string;
    FHasReadData: Boolean;
    FPort: Integer;
    FIP: string;
    FNeedClose: Boolean;
    procedure DoSleep(AMilliseconds: Integer);
    function DoRecv(s: TSocket; var Buf; len, flags: Integer): Integer;
    function DoSend(s: TSocket; var Buf; len, flags: Integer): Integer;
    function GetConnection: TclConnection;
    function NeedStop: Boolean;
  protected
    procedure UpdateProgress(ABytesProceed: Int64); virtual;
    procedure StreamReady; virtual;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Assign(ASource: TclNetworkStream); virtual;
    function Connect(const AIP: string; APort: Integer): Boolean; virtual;
    procedure Listen(APort: Integer); virtual;
    procedure Accept; virtual;
    procedure Close(ANotifyPeer: Boolean); virtual;
    function Read(AData: TStream): Boolean; virtual;
    function Write(AData: TStream): Boolean; virtual;
    function GetBatchSize: Integer; virtual;
    procedure OpenClientSession; virtual;
    procedure OpenServerSession; virtual;
    procedure ClearNextAction;
    procedure SetNextAction(Action: TclNetworkStreamAction);
    property Connection: TclConnection read GetConnection;
    property NextAction: TclNetworkStreamAction read FNextAction;
    property HasReadData: Boolean read FHasReadData write FHasReadData;
    property ListenPort: Integer read FListenPort;
    property PeerName: string read FPeerName;
    property PeerIP: string read FPeerIP;
    property IP: string read FIP;
    property Port: Integer read FPort;
    property NeedClose: Boolean read FNeedClose;
  end;
  
  TclConnection = class
  private
    FSocket: TSocket;
    FBatchSize: Integer;
    FIsAborted: Boolean;
    FNetworkStream: TclNetworkStream;
    FActive: Boolean;
    FBitsPerSec: Integer;
    FTotalBytesProceed: Int64;
    FBytesProceed: Int64;
    FTotalBytes: Int64;
    FBytesToProceed: Int64;
    FOnProgress: TclSocketProgress64Event;
    FOnReady: TNotifyEvent;
    function GetNetworkStream: TclNetworkStream;
    procedure SetNetworkStream(const Value: TclNetworkStream);
    procedure ShutdownSocket;
  protected
    function IsProceedLimit: Boolean;
    procedure DoDestroy; virtual;
    procedure DoProgress(ABytesProceed, ATotalBytes: Int64); virtual;
    procedure DoReady; virtual;
  public
    constructor Create;
    destructor Destroy; override;
    procedure DispatchNextAction; virtual; abstract;
    procedure InitProgress(ABytesProceed, ATotalBytes: Int64);
    procedure ReadData(AData: TStream); virtual; abstract;
    procedure WriteData(AData: TStream); virtual; abstract;
    procedure Close(ANotifyPeer: Boolean);
    procedure CloseSession(ANotifyPeer: Boolean);
    procedure Abort;
    property NetworkStream: TclNetworkStream read GetNetworkStream write SetNetworkStream;
    property IsAborted: Boolean read FIsAborted;
    property Active: Boolean read FActive;
    property BytesProceed: Int64 read FTotalBytesProceed;
    property Socket: TSocket read FSocket write FSocket;
    property BatchSize: Integer read FBatchSize write FBatchSize;
    property BitsPerSec: Integer read FBitsPerSec write FBitsPerSec;
    property BytesToProceed: Int64 read FBytesToProceed write FBytesToProceed;
    property OnProgress: TclSocketProgress64Event read FOnProgress write FOnProgress;
    property OnReady: TNotifyEvent read FOnReady write FOnReady;
  end;

  TclAsyncConnection = class(TclConnection)
  private
    FRefCount: Integer;
    function GetPeerIP: string;
    function GetPeerName: string;
  public
    constructor Create;
    procedure DispatchNextAction; override;
    procedure ReadData(AData: TStream); override;
    procedure WriteData(AData: TStream); override;
    procedure AcceptConnection;
    procedure AcceptConnectionDone;
    procedure OpenSession;
    function _AddRef: Integer;
    function _Release: Integer;
    property PeerName: string read GetPeerName;
    property PeerIP: string read GetPeerIP;
  end;

  TclSyncConnection = class(TclConnection)
  private
    FTimeOut: Integer;
    FSocketEvent: THandle;
    FIsReadUntilClose: Boolean;
    FTimeOutTicks: DWORD;
    procedure InitTimeOutTicks;
    procedure InternalReadData(AData: TStream);
    procedure InternalWriteData(AData: TStream);
  protected
    procedure CreateSocket(AStruct, AProtocol: Integer);
    procedure SelectSocketEvent(lNetworkEvents: DWORD);
    procedure DoDestroy; override;
  public
    constructor Create;
    procedure DispatchNextAction; override;
    procedure ReadData(AData: TStream); override;
    procedure WriteData(AData: TStream); override;
    procedure WriteString(const AString: string);
    property TimeOut: Integer read FTimeOut write FTimeOut;
    property SocketEvent: THandle read FSocketEvent;
    property IsReadUntilClose: Boolean read FIsReadUntilClose write FIsReadUntilClose;
  end;

  TclUdpClientConnection = class(TclSyncConnection)
  private
    function GetIP: string;
    function GetPort: Integer;
  public
    procedure Open(const AIP: string; APort: Integer);
    property IP: string read GetIP;
    property Port: Integer read GetPort;
  end;

  TclTcpClientConnection = class(TclSyncConnection)
  private
    function GetIP: string;
    function GetPort: Integer;
  public
    procedure Open(const AIP: string; APort: Integer);
    procedure OpenSession;
    property IP: string read GetIP;
    property Port: Integer read GetPort;
  end;

  TclTcpServerConnection = class(TclSyncConnection)
  public
    function Open(APort: Integer): Integer;
    procedure AcceptConnection;
    procedure OpenSession;
  end;

  TclHostIPResolver = class
  private
    FAsyncError: Integer;
    FLookupHandle: THandle;
    FCompleted: THandle;
    FIsAborted: Boolean;
    function GetHostEntry(const AHostName: string; ATimeOut: Integer): PHostEnt;
    procedure WndProc(var Message: TMessage);
    procedure DestroyWindowHandle(AWndHandle: HWND);
  public
    function GetHostIP(const AHostName: string; ATimeOut: Integer): string;
    procedure Abort;
  end;
  
function GetLocalHost: string;
function GetHostIP(const AHostName: string; ATimeOut: Integer = 5000): string;
function GetWSAErrorText(AErrorCode: Integer): string;
procedure RaiseSocketError(AErrorCode: Integer); overload;
procedure RaiseSocketError(const AErrorMessage: string; AErrorCode: Integer); overload;

resourcestring
  cInvalidAddress = 'Invalid host address';
  cInvalidPort = 'Invalid port number';
  cTimeoutOccured = 'Timeout error occured';
  cBatchSizeInvalid = 'Invalid Batch Size';
  cNoNetworkStream = 'NetworkStream is required';

implementation

uses
  clUtils{$IFNDEF DELPHI6}, Forms{$ENDIF}{$IFDEF LOGGER}, clLogger{$ENDIF};

const
  CL_SOCKETEVENT = WM_USER + 2110;

function WaitForEvent(AEvent: THandle; ATimeOutTicks, ATimeOut: Integer): Boolean;
var
  res: DWORD;
  Msg: TMsg;
  events: array[0..0] of THandle;
begin
  events[0] := AEvent;
  res := MsgWaitForMultipleObjects(1, events, FALSE, DWORD(ATimeOut), QS_ALLEVENTS);
  case res of
    WAIT_FAILED:
      begin
        RaiseSocketError(WSAGetLastError());
      end;
    WAIT_TIMEOUT:
      begin
        RaiseSocketError(cTimeoutOccured, -1);
      end;
    WAIT_OBJECT_0 + 1:
      begin
        while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
        begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
          if Integer(GetTickCount()) - ATimeOutTicks > ATimeOut then
          begin
            RaiseSocketError(cTimeoutOccured, -1);
          end;
        end;
        if Integer(GetTickCount()) - ATimeOutTicks > ATimeOut then
        begin
          RaiseSocketError(cTimeoutOccured, -1);
        end;
      end;
  end;
  Result := (res = WAIT_OBJECT_0);
end;

type
  TclLookupComplete = record
    Msg: Cardinal;
    LookupHandle: THandle;
    AsyncBufLen: Word;
    AsyncError: Word;
    Result: Longint;
  end;

{ TclHostIPResolver }

procedure TclHostIPResolver.WndProc(var Message: TMessage);
begin
  if (Message.Msg = CL_SOCKETEVENT)
    and (TclLookupComplete(Message).LookupHandle = FLookupHandle) then
  begin
    FAsyncError := TclLookupComplete(Message).AsyncError;
    SetEvent(FCompleted);
  end;
end;

procedure TclHostIPResolver.DestroyWindowHandle(AWndHandle: HWND);
var
  lpMsg: TMsg;
begin
  while PeekMessage(lpMsg, AWndHandle, 0, 0, PM_REMOVE) do;
  DeallocateHWnd(AWndHandle);
end;

function TclHostIPResolver.GetHostEntry(const AHostName: string; ATimeOut: Integer): PHostEnt;
var
  wndHandle: HWND;
  hostData: PChar;
begin
  Result := AllocMem(MAXGETHOSTSTRUCT);
  try
    FCompleted := CreateEvent(nil, False, False, nil);
    wndHandle := AllocateHWnd(WndProc);
    try
      FAsyncError := 0;
      hostData := PChar(Result);
      FLookupHandle := WSAAsyncGetHostByName(wndHandle, CL_SOCKETEVENT, PChar(AHostName), hostData, MAXGETHOSTSTRUCT);
      if (FLookupHandle = 0) then
      begin
        RaiseSocketError(WSAGetLastError());
      end;

      FIsAborted := False;
      repeat
        try
          if WaitForEvent(FCompleted, GetTickCount(), ATimeOut) then Break;
        except
          WSACancelAsyncRequest(FLookupHandle);
          FLookupHandle := 0;
          raise;
        end;
      until FIsAborted;
      FLookupHandle := 0;

      if (FAsyncError <> 0) then
      begin
        RaiseSocketError(FAsyncError);
      end;
    finally
      DestroyWindowHandle(wndHandle);
      CloseHandle(FCompleted);
    end;
  except
    FreeMem(Result);
    raise;
  end;
end;

function TclHostIPResolver.GetHostIP(const AHostName: string; ATimeOut: Integer): string;
var
  hostEnt: PHostEnt;
  addrList: PChar;
begin
  hostEnt := GetHostEntry(AHostName, ATimeOut);
  try
    addrList := hostEnt^.h_addr_list^;
    Result := Format('%d.%d.%d.%d',
      [Ord(addrList[0]), Ord(addrList[1]), Ord(addrList[2]), Ord(addrList[3])]);
  finally
    FreeMem(hostEnt);
  end;
end;

function GetLocalHost: string;
var
  LocalName: array[0..255] of Char;
begin
  Result := '';
  if gethostname(LocalName, SizeOf(LocalName)) = 0 then
    Result := LocalName;
end;

function GetHostIP(const AHostName: string; ATimeOut: Integer): string;
var
  resolver: TclHostIPResolver;
begin
  resolver := TclHostIPResolver.Create();
  try
    Result := resolver.GetHostIP(AHostName, ATimeOut);
  finally
    resolver.Free();
  end;
end;

function GetWSAErrorText(AErrorCode: Integer): string;
var
  Buffer: array[0..255] of Char;
begin
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, AErrorCode, 0, Buffer, SizeOf(Buffer), nil);
  Result := Trim(Buffer);
end;

procedure RaiseSocketError(AErrorCode: Integer);
begin
  raise EclSocketError.Create(GetWSAErrorText(AErrorCode), AErrorCode);
end;

procedure RaiseSocketError(const AErrorMessage: string; AErrorCode: Integer);
begin
  raise EclSocketError.Create(AErrorMessage, AErrorCode);
end;

procedure TclHostIPResolver.Abort;
begin
  FIsAborted := True;
  if (FLookupHandle <> 0) then
  begin
    WSACancelAsyncRequest(FLookupHandle);
  end;
end;

{ TclConnection }

constructor TclConnection.Create;
begin
  inherited Create();
  FSocket := INVALID_SOCKET;
  FBatchSize := 8192;
  FBytesToProceed := -1;
end;

destructor TclConnection.Destroy;
begin
  try
    Close(False);
  except
    on EclSocketError do ;
  end;
  DoDestroy();
  inherited Destroy();
end;

procedure TclConnection.ShutdownSocket;
begin
  FActive := False;
  if (FSocket <> INVALID_SOCKET) then
  begin
    shutdown(FSocket, SD_BOTH);
    closesocket(FSocket);
    FSocket := INVALID_SOCKET;
  end;
end;

procedure TclConnection.CloseSession(ANotifyPeer: Boolean);
begin
  NetworkStream.Close(ANotifyPeer);
  if ANotifyPeer then
  begin
    DispatchNextAction();
  end;
end;

procedure TclConnection.Close(ANotifyPeer: Boolean);
begin
{$IFDEF LOGGER}clPutLogMessage(Self, edInside, 'Close');{$ENDIF}
  try
    if Active then
    begin
      CloseSession(ANotifyPeer);
    end;
  finally
    ShutdownSocket();
  end;
end;

procedure TclConnection.Abort;
begin
  FIsAborted := True;
end;

procedure TclConnection.DoDestroy;
begin
  NetworkStream := nil;
end;

procedure TclConnection.DoProgress(ABytesProceed, ATotalBytes: Int64);
begin
  if Assigned(OnProgress) then
  begin

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本大香伊一区二区三区| av高清久久久| 精品一区二区日韩| 韩日av一区二区| 成人午夜碰碰视频| 日本久久电影网| 91精品国产色综合久久| 在线成人小视频| 欧美日韩国产123区| 26uuu另类欧美| 国产精品久久久久一区二区三区| 久久久国产精品午夜一区ai换脸| 国产精品第13页| 亚洲三级免费电影| 免费人成网站在线观看欧美高清| 欧美一区欧美二区| 日韩精品亚洲专区| 男人的j进女人的j一区| 国产精品一品视频| 欧美色视频在线| 久久人人超碰精品| 无码av免费一区二区三区试看| 久久国产精品无码网站| 94-欧美-setu| 日韩一区二区三区在线观看| 国产精品美女久久久久久久| 天天操天天综合网| 懂色av一区二区三区蜜臀| 91久久免费观看| 欧美视频中文字幕| 国产精品二三区| 麻豆一区二区在线| 91香蕉视频在线| 精品国产91久久久久久久妲己| 亚洲午夜精品网| 国产精品一区不卡| 91精品国产高清一区二区三区 | 欧美亚洲自拍偷拍| 久久久久国产精品厨房| 一卡二卡三卡日韩欧美| 久久精品国产精品亚洲红杏| 色八戒一区二区三区| 国产亚洲美州欧州综合国| 同产精品九九九| 成人av午夜电影| 国产精品久久久久影院老司| 国产一区二区三区免费播放| 日韩欧美中文一区| 亚洲不卡av一区二区三区| 色婷婷狠狠综合| 国产精品二三区| 国产盗摄视频一区二区三区| 日韩亚洲电影在线| 亚洲欧美色一区| 欧美影视一区在线| 亚洲视频一区二区在线观看| 丁香激情综合五月| 久久综合色8888| 国产成a人无v码亚洲福利| 精品国产免费一区二区三区四区 | 国产精品主播直播| 欧美成人性战久久| 一二三区精品视频| 欧美精品日韩综合在线| 亚洲一区二区三区四区不卡| 日本丶国产丶欧美色综合| 亚洲综合免费观看高清完整版在线| 成人sese在线| 国产精品美女久久福利网站| 国产福利一区二区三区| 亚洲欧洲国产专区| 99天天综合性| 亚洲美女视频在线| 欧美伊人久久大香线蕉综合69 | 国产日本欧洲亚洲| 韩国精品免费视频| 国产女同互慰高潮91漫画| 国产成人福利片| 国产精品卡一卡二卡三| 99精品视频中文字幕| 国产欧美视频一区二区三区| 91蝌蚪porny九色| 一区二区三区产品免费精品久久75| 91久久精品一区二区| 一级特黄大欧美久久久| 欧美二区三区91| 国产真实乱偷精品视频免| 国产三区在线成人av| 91在线视频18| 蜜臀91精品一区二区三区 | 精品美女一区二区三区| 麻豆视频一区二区| 久久这里只有精品6| 99re这里都是精品| 亚洲一区在线电影| 欧美一二三四区在线| 国产一区二区在线看| 久久精品一区八戒影视| 一本色道久久综合狠狠躁的推荐| 亚洲黄一区二区三区| 91麻豆精品国产91久久久久| 国产原创一区二区| 亚洲欧洲综合另类| 2023国产精品| 色综合中文综合网| 日韩精品视频网站| 欧美国产日韩a欧美在线观看| 91欧美一区二区| 午夜精品福利一区二区三区蜜桃| 精品国产一区二区三区不卡| 波多野结衣在线一区| 同产精品九九九| 中日韩av电影| 在线视频亚洲一区| 国产白丝网站精品污在线入口| 亚洲人成影院在线观看| 日韩女优av电影在线观看| 成人动漫在线一区| 日韩精品乱码免费| 亚洲女女做受ⅹxx高潮| 精品国产一区二区亚洲人成毛片 | 99热在这里有精品免费| 自拍偷拍国产亚洲| 久久毛片高清国产| 欧美一区二区视频在线观看2022| 国产99精品在线观看| 日韩高清欧美激情| 最新国产成人在线观看| 精品一区二区三区在线播放| 欧美亚洲综合网| 99视频在线观看一区三区| 国产一区二区三区av电影| 日韩福利视频网| 亚洲福利视频一区| 亚洲猫色日本管| 亚洲精品免费一二三区| 国产精品毛片无遮挡高清| 久久影院视频免费| 亚洲精品在线电影| 欧美成人精品福利| 日韩视频一区二区三区| 在线不卡免费av| 欧美人妇做爰xxxⅹ性高电影| 欧美中文一区二区三区| 色哟哟在线观看一区二区三区| 99久久婷婷国产综合精品| 成人精品小蝌蚪| www.欧美日韩| 91视频免费播放| 欧美亚洲日本国产| 欧美在线观看视频一区二区| 色美美综合视频| 欧美性大战久久| 欧美三级电影网| 91麻豆精品国产无毒不卡在线观看 | 欧美三级电影网站| 欧美精品色一区二区三区| 久久久久久亚洲综合影院红桃| 欧美高清dvd| 26uuu精品一区二区在线观看| 日本韩国一区二区三区视频| 色综合天天综合网国产成人综合天| 国产成人欧美日韩在线电影| 久草精品在线观看| 激情综合色综合久久| 美日韩黄色大片| 国产一区欧美一区| 91视频www| 97se亚洲国产综合自在线| 日韩黄色免费电影| 国产呦精品一区二区三区网站| 粉嫩av亚洲一区二区图片| 久久久99精品久久| 26uuu国产日韩综合| 亚洲精品一区二区三区香蕉| 精品福利一二区| 天天av天天翘天天综合网 | 99国产精品久久久| 精品写真视频在线观看| 成人久久久精品乱码一区二区三区| 夜夜精品浪潮av一区二区三区| 亚洲第四色夜色| 亚洲chinese男男1069| 2023国产精品视频| 亚洲欧洲99久久| 亚洲国产一二三| 狠狠色狠狠色综合| 在线亚洲人成电影网站色www| 4438亚洲最大| 中文字幕制服丝袜成人av| 亚洲成人手机在线| 国产精品一二三四| 欧美疯狂做受xxxx富婆| 国产欧美精品区一区二区三区| 亚洲bt欧美bt精品777| 国产jizzjizz一区二区| 欧美片在线播放| 中文字幕视频一区| 久久国产免费看| 欧美日韩一区视频|