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

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

?? idtunnelmaster.pas

?? delphi indy9.0.18組件包
?? 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:  10403: IdTunnelMaster.pas 
{
{   Rev 1.0    2002.11.12 10:58:30 PM  czhower
}
unit IdTunnelMaster;

interface

uses
  Classes, SyncObjs,
  IdTCPServer, IdTCPClient, IdTunnelCommon;

type
  TIdTunnelMaster = class;

  ///////////////////////////////////////////////////////////////////////////////
  // Master Tunnel classes
  //
  // Thread to communicate with the service
  MClientThread = class(TThread)
  public
    MasterParent: TIdTunnelMaster;
    UserId: Integer;
    MasterThread: TIdPeerThread;
    OutboundClient: TIdTCPClient;
    DisconnectedOnRequest: Boolean;
    Locker: TCriticalSection;
    SelfDisconnected: Boolean;

    procedure Execute; override;
    constructor Create(AMaster: TIdTunnelMaster);
    destructor Destroy; override;
  end;

  // Slave thread - communicates with the Master, tunnel
  TSlaveData = class(TObject)
  public
    Receiver: TReceiver;
    Sender: TSender;
    Locker: TCriticalSection;
    SelfDisconnected: Boolean;
    UserData: TObject;
  end;

  TIdSendMsgEvent  = procedure(Thread: TIdPeerThread; var CustomMsg: String) of object;
  TIdSendTrnEvent  = procedure(Thread: TIdPeerThread; var Header: TIdHeader; var CustomMsg: String) of object;
  TIdSendTrnEventC = procedure(var Header: TIdHeader; var CustomMsg: String) of object;
  TIdTunnelEventC  = procedure(Receiver: TReceiver) of object;
  TIdSendMsgEventC = procedure(var CustomMsg: String) of object;
//  TTunnelEvent   = procedure(Thread: TSlaveThread) of object;

  TIdTunnelMaster = class(TIdTCPServer)
  protected
    fiMappedPort: Integer;
    fsMappedHost: String;
    Clients: TThreadList;
    fOnConnect,
    fOnDisconnect,
    fOnTransformRead: TIdServerThreadEvent;
    fOnTransformSend: TSendTrnEvent;
    fOnInterpretMsg: TSendMsgEvent;
    OnlyOneThread: TCriticalSection;

    // LockSlavesNumber: TCriticalSection;
    //LockServicesNumber: TCriticalSection;
    StatisticsLocker: TCriticalSection;
    fbActive: Boolean;
    fbLockDestinationHost: Boolean;
    fbLockDestinationPort: Boolean;
    fLogger: TLogger;

    // Statistics counters
    flConnectedSlaves,            // Number of connected slave tunnels
    flConnectedServices,          // Number of connected service threads
    fNumberOfConnectionsValue,
    fNumberOfPacketsValue,
    fCompressionRatioValue,
    fCompressedBytes,
    fBytesRead,
    fBytesWrite: Integer;
    procedure ClientOperation(Operation: Integer; UserId: Integer; s: String);
    procedure SendMsg(MasterThread: TIdPeerThread; var Header: TIdHeader; s: String);
    procedure DisconectAllUsers;
    procedure DisconnectAllSubThreads(TunnelThread: TIdPeerThread);
    function  GetNumSlaves: Integer;
    function  GetNumServices: Integer;
    function GetClientThread(UserID: Integer): MClientThread;
    procedure SetActive(pbValue: Boolean); override;
    procedure DoConnect(Thread: TIdPeerThread); override;
    procedure DoDisconnect(Thread: TIdPeerThread); override;
    function DoExecute(Thread: TIdPeerThread): boolean; override;
    procedure DoTransformRead(Thread: TIdPeerThread); virtual;
    procedure DoTransformSend(Thread: TIdPeerThread; var Header: TIdHeader; var CustomMsg: String);
     virtual;
    procedure DoInterpretMsg(Thread: TIdPeerThread; var CustomMsg: String); virtual;
    procedure LogEvent(Msg: String);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure SetStatistics(Module: Integer; Value: Integer);
    procedure GetStatistics(Module: Integer; var Value: Integer);

    property Active: Boolean read FbActive write SetActive Default True;
    property Logger: TLogger read fLogger write fLogger;
    property NumSlaves: Integer read GetNumSlaves;
    property NumServices: Integer read GetNumServices;
  published
    property MappedHost: string read fsMappedHost write fsMappedHost;
    property MappedPort: Integer read fiMappedPort write fiMappedPort;
    property LockDestinationHost: Boolean read fbLockDestinationHost write fbLockDestinationHost
     default False;
    property LockDestinationPort: Boolean read fbLockDestinationPort write fbLockDestinationPort
     default False;
    property OnConnect: TIdServerThreadEvent read FOnConnect write FOnConnect;
    property OnDisconnect: TIdServerThreadEvent read FOnDisconnect write FOnDisconnect;
    property OnTransformRead: TIdServerThreadEvent read fOnTransformRead write fOnTransformRead;
    property OnTransformSend: TSendTrnEvent read fOnTransformSend write fOnTransformSend;
    property OnInterpretMsg: TSendMsgEvent read fOnInterpretMsg write fOnInterpretMsg;
  end;
  //
  // END Master Tunnel classes
  ///////////////////////////////////////////////////////////////////////////////


implementation
  uses IdException,
       IdGlobal, IdStack, IdResourceStrings, SysUtils;


///////////////////////////////////////////////////////////////////////////////
// Master Tunnel classes
//
constructor TIdTunnelMaster.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Clients := TThreadList.Create;

  fbActive := False;
  flConnectedSlaves := 0;
  flConnectedServices := 0;

  fNumberOfConnectionsValue := 0;
  fNumberOfPacketsValue := 0;
  fCompressionRatioValue := 0;
  fCompressedBytes := 0;
  fBytesRead := 0;
  fBytesWrite := 0;

  OnlyOneThread := TCriticalSection.Create;
  StatisticsLocker := TCriticalSection.Create;
end;

destructor TIdTunnelMaster.Destroy;
begin
  Logger := nil;
  Active := False;
  if (csDesigning in ComponentState) then begin
    DisconectAllUsers; // disconnects service threads
  end;

  FreeAndNil(Clients);
  FreeAndNil(OnlyOneThread);
  FreeAndNil(StatisticsLocker);

  inherited Destroy;
end;


procedure TIdTunnelMaster.SetActive(pbValue: Boolean);
begin
  if fbActive = pbValue then
    exit;

//  if not ((csLoading in ComponentState) or (csDesigning in ComponentState)) then begin
  if pbValue then begin
    inherited SetActive(True);
  end
  else begin
    inherited SetActive(False);
    DisconectAllUsers; // also disconnectes service threads
  end;

//  end;
  fbActive := pbValue;
end;

procedure TIdTunnelMaster.LogEvent(Msg: String);
begin
  if Assigned(fLogger) then
    fLogger.LogEvent(Msg);
end;

function TIdTunnelMaster.GetNumSlaves: Integer;
var
  ClientsNo: Integer;
begin
  GetStatistics(NumberOfSlavesType, ClientsNo);
  Result := ClientsNo;
end;

function TIdTunnelMaster.GetNumServices: Integer;
var
  ClientsNo: Integer;
begin
  GetStatistics(NumberOfServicesType, ClientsNo);
  Result := ClientsNo;
end;

procedure TIdTunnelMaster.GetStatistics(Module: Integer; var Value: Integer);
begin
  StatisticsLocker.Enter;
  try
    case Module of
      NumberOfSlavesType: begin
         Value := flConnectedSlaves;
      end;

      NumberOfServicesType: begin
         Value := flConnectedServices;
      end;
    
      NumberOfConnectionsType: begin
        Value := fNumberOfConnectionsValue;
      end;

      NumberOfPacketsType: begin
        Value := fNumberOfPacketsValue;
      end;

      CompressionRatioType: begin
        if fCompressedBytes > 0 then begin
          Value := Trunc((fBytesRead * 1.0) / (fCompressedBytes * 1.0) * 100.0)
        end
        else begin
          Value := 0;
        end;
      end;

      CompressedBytesType: begin
         Value := fCompressedBytes;
      end;

      BytesReadType: begin
         Value := fBytesRead;
      end;

      BytesWriteType: begin
         Value := fBytesWrite;
      end;
    end;
  finally
    StatisticsLocker.Leave;
  end;
end;

procedure TIdTunnelMaster.SetStatistics(Module: Integer; Value: Integer);
var
  packets: Real;
  ratio: Real;
begin
  StatisticsLocker.Enter;
  try
    case Module of
      NumberOfSlavesType: begin
        if TIdStatisticsOperation(Value) = soIncrease then begin
          Inc(flConnectedSlaves);
        end
        else begin
          Dec(flConnectedSlaves);
        end;
      end;

      NumberOfServicesType: begin
        if TIdStatisticsOperation(Value) = soIncrease then begin
          Inc(flConnectedServices);
          Inc(fNumberOfConnectionsValue);
        end
        else begin
          Dec(flConnectedServices);
        end;
      end;

      NumberOfConnectionsType: begin
        Inc(fNumberOfConnectionsValue);
      end;

      NumberOfPacketsType: begin
        Inc(fNumberOfPacketsValue);
      end;

      CompressionRatioType: begin
        ratio := fCompressionRatioValue;
        packets := fNumberOfPacketsValue;
        ratio := (ratio/100.0 * (packets - 1.0) + Value/100.0) / packets;
        fCompressionRatioValue := Trunc(ratio * 100);
      end;

      CompressedBytesType: begin
        fCompressedBytes := fCompressedBytes + Value;
      end;

      BytesReadType: begin
        fBytesRead := fBytesRead + Value;
      end;

      BytesWriteType: begin
        fBytesWrite := fBytesWrite + Value;
      end;
    end;
  finally
    StatisticsLocker.Leave;
  end;
end;

procedure TIdTunnelMaster.DoConnect(Thread: TIdPeerThread);
begin

  Thread.Data := TSlaveData.Create;
  with TSlaveData(Thread.Data) do begin
    Receiver := TReceiver.Create;
    Sender := TSender.Create;
    SelfDisconnected := False;
    Locker := TCriticalSection.Create;
  end;
  if Assigned(OnConnect) then begin
    OnConnect(Thread);
  end;
  SetStatistics(NumberOfSlavesType, Integer(soIncrease));

end;


procedure TIdTunnelMaster.DoDisconnect(Thread: TIdPeerThread);
begin

  SetStatistics(NumberOfSlavesType, Integer(soDecrease));
  // disconnect all service threads, owned by this tunnel
  DisconnectAllSubThreads(Thread);
  if Thread.Connection.Connected then
    Thread.Connection.Disconnect;

  If Assigned(OnDisconnect) then begin
    OnDisconnect(Thread);
  end;

  with TSlaveData(Thread.Data) do begin
    Receiver.Free;
    Sender.Free;
    Locker.Free;
    TSlaveData(Thread.Data).Free;
  end;
  Thread.Data := nil;

end;


function TIdTunnelMaster.DoExecute(Thread: TIdPeerThread): boolean;
var
  user: TSlaveData;
  clientThread: MClientThread;
  s: String;
  ErrorConnecting: Boolean;
  sIP: String;
  CustomMsg: String;
  Header: TIdHeader;
begin
  result := true;

  user := TSlaveData(Thread.Data);
  if Thread.Connection.IOHandler.Readable(IdTimeoutInfinite) then  begin
    user.receiver.Data := Thread.Connection.CurrentReadBuffer;

    // increase the packets counter
    SetStatistics(NumberOfPacketsType, 0);

    while user.receiver.TypeDetected do begin
      // security filter
      if not (user.receiver.Header.MsgType in [tmData, tmDisconnect, tmConnect, tmCustom]) then begin
        Thread.Connection.Disconnect;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看一区日韩| 亚洲品质自拍视频| 一区二区三区在线观看视频| 免费成人在线观看| 色噜噜久久综合| 久久久噜噜噜久噜久久综合| 亚洲a一区二区| 99久久久国产精品| 精品日韩成人av| 午夜日韩在线观看| 色呦呦日韩精品| 亚洲精品在线网站| 免费看日韩精品| 欧美人伦禁忌dvd放荡欲情| 国产精品福利影院| 国产成人免费视频一区| 欧美一区二区二区| 免费观看成人鲁鲁鲁鲁鲁视频| 91国偷自产一区二区开放时间 | 在线不卡中文字幕播放| 日韩美女视频19| 丰满亚洲少妇av| www国产精品av| 久久aⅴ国产欧美74aaa| 欧美一区二区三区精品| 亚洲一区二区三区中文字幕| 色综合中文综合网| 狠狠色丁香久久婷婷综合丁香| 欧美日韩一区二区电影| 亚洲精选视频在线| 在线一区二区视频| 亚洲日本韩国一区| 色呦呦网站一区| 亚洲午夜免费电影| 欧美巨大另类极品videosbest| 亚洲成人7777| 日韩视频不卡中文| 国产精品一区二区久激情瑜伽 | 亚洲色图.com| 91精彩视频在线| 亚州成人在线电影| 日韩精品一区二区三区四区| 狠狠色丁香久久婷婷综合丁香| 久久久精品天堂| av激情综合网| 国产成人综合亚洲网站| 久久精品一区二区三区av| 国产一区免费电影| 国产精品久久毛片a| caoporen国产精品视频| 亚洲精品视频一区二区| 在线91免费看| 国产精品主播直播| 亚洲精品自拍动漫在线| 欧美日韩三级一区| 国产在线精品一区二区三区不卡| 国产亚洲精品超碰| 99精品欧美一区| 亚洲午夜电影在线| 精品国产精品一区二区夜夜嗨| 高清不卡一区二区| 亚洲一级二级在线| 久久精品日产第一区二区三区高清版| 成人午夜免费视频| 日韩在线a电影| 国产拍欧美日韩视频二区| 色噜噜狠狠色综合欧洲selulu| 蜜臀av一区二区三区| 国产精品美女久久久久aⅴ国产馆| 在线观看不卡一区| 国产精华液一区二区三区| 一区二区高清视频在线观看| 日韩欧美高清在线| 日本伦理一区二区| 久久99精品视频| 亚洲美女少妇撒尿| 久久亚洲精华国产精华液| 日本韩国精品一区二区在线观看| 免费久久99精品国产| 亚洲欧美激情视频在线观看一区二区三区 | 久久久久久亚洲综合影院红桃 | 色婷婷综合中文久久一本| 蜜臀av性久久久久蜜臀aⅴ四虎 | 91久久国产最好的精华液| 国产麻豆91精品| 日本中文字幕一区二区视频 | 图片区小说区区亚洲影院| 国产午夜精品久久久久久久 | 天堂蜜桃一区二区三区| 中文字幕一区二区日韩精品绯色| 日韩欧美一二三| 欧美日本一区二区| 91视频.com| 国产成人午夜高潮毛片| 美女精品自拍一二三四| 亚洲国产美女搞黄色| 日韩久久一区二区| 日本一区二区视频在线| 精品美女被调教视频大全网站| 欧美日韩精品欧美日韩精品| 99久久精品免费精品国产| 国产精品影视在线| 极品美女销魂一区二区三区免费| 午夜a成v人精品| 亚洲成人资源网| 亚洲一区二区在线免费观看视频| 成人免费在线视频观看| 国产精品午夜在线观看| 日本一区二区在线不卡| 国产日韩欧美精品电影三级在线| 久久精品视频一区二区三区| 欧美第一区第二区| 久久综合久久综合九色| 久久网站最新地址| 久久人人爽爽爽人久久久| 日韩精品一区二区三区三区免费| 欧美一区二区成人| 精品久久久久久综合日本欧美| 欧美xxxxxxxx| 久久亚洲精精品中文字幕早川悠里| 精品福利在线导航| 国产网站一区二区| 国产精品乱人伦中文| 亚洲图片激情小说| 亚洲一二三四区| 蜜桃传媒麻豆第一区在线观看| 免费成人深夜小野草| 精彩视频一区二区三区| 国产成人啪免费观看软件| www.在线成人| 欧美日韩亚洲另类| 欧美一区午夜精品| 欧美精品一区男女天堂| 久久久久国产精品厨房| 亚洲人123区| 日韩精品国产欧美| 国产成人三级在线观看| 在线视频你懂得一区二区三区| 欧美色综合影院| 欧美v日韩v国产v| 中文字幕一区免费在线观看| 亚洲午夜一二三区视频| 国内不卡的二区三区中文字幕 | 欧美三级蜜桃2在线观看| 日韩西西人体444www| 中文天堂在线一区| 丝袜美腿亚洲综合| 国产精一区二区三区| 色噜噜久久综合| 精品久久久久久久久久久久包黑料 | 亚洲一二三四在线| 国产一区二区免费视频| 色婷婷精品久久二区二区蜜臀av| 日韩亚洲欧美综合| 成人免费在线观看入口| 久久成人久久鬼色| 91黄色小视频| 国产性色一区二区| 日韩电影在线一区| 91丝袜高跟美女视频| 2024国产精品| 一区二区三区高清在线| 国产精品影视天天线| 欧美男男青年gay1069videost| 中文字幕精品综合| 美国精品在线观看| 色综合天天综合在线视频| 亚洲精品一区二区三区99| 亚洲午夜精品一区二区三区他趣| 国产成人精品免费视频网站| 欧美一区二区网站| 亚洲人成伊人成综合网小说| 国产一区在线观看麻豆| 在线不卡a资源高清| 夜夜精品视频一区二区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美日韩小视频| 日韩理论片一区二区| 国产精品一区二区果冻传媒| 日韩欧美一区二区视频| 亚洲成人tv网| 欧美中文字幕不卡| 国产精品乱码一区二三区小蝌蚪| 精品伊人久久久久7777人| 4438成人网| 午夜影院久久久| 欧美日韩在线电影| 亚洲欧美激情视频在线观看一区二区三区| 国产精品一区二区视频| 精品电影一区二区三区| 蜜桃av噜噜一区| 91精品国产综合久久久久久| 亚洲国产精品久久久久秋霞影院| 91污片在线观看| 亚洲乱码国产乱码精品精小说| 91丨porny丨最新| 尤物视频一区二区| 在线观看视频一区| 亚洲激情在线激情| 欧美性极品少妇|