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

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

?? nhcnetbase.pas

?? NetHook API 對戰平臺內核庫是一套實現時下流行的網絡對戰平臺[如浩方、VS]同樣功能的通用內核庫
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit NhcNetBase;

interface

uses
  Windows, SysUtils, Classes, NhSocketObj;

type

{ Classes }

  TNetIO = class;
  TNetDriver = class;
  TNetHandler = class;

{ TNetIO }
{
  負責底層收發 TCP/UDP 數據,不區分應用層協議。收到數據包后,直接將數據分發
  給各個 NetDriver。NetDriver 也可以直接使用 NetIO 的數據發送功能。
}

  TNetIO = class(TObject)
  private
    FUdpServer: TUdpServer;           // UDP 服務器
    FNetDriverList: TList;            // TNetDriver[]

  private
    procedure RegisterNetDriver(NetDriver: TNetDriver);
    procedure UnregisterNetDriver(NetDriver: TNetDriver);

    function GetFreeUdpPort(StartPort, CheckTimes: Integer): Integer;
    function InitUdpServer(UdpPortStart, CheckPortTimes: Integer): Boolean;

    procedure DoOnUdpServerRecvData(Sender: TObject; const PacketBuffer;
      PacketSize: Integer; const PeerAddr: TPeerAddress);
  public
    constructor Create;
    destructor Destroy; override;

    // 初始化/停止 UDP 服務器
    function InitServer(UdpPortStart, CheckPortTimes: Integer): Boolean;
    procedure StopServer;

    // 處理收到的UDP數據包
    procedure ProcessRecvedUdpPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress);

    property UdpServer: TUdpServer read FUdpServer;
  end;

{ TNetDriver }
{
  當一個項目中含有多個應用層網絡協議時,一個 NetDriver 可以用來處理其中一種
  應用層協議的數據收發事務。需注意的是,NetDriver 只負責該協議之中的數據收發、
  數據包的構建等事宜,并不處理應用層業務邏輯(比如登錄、注銷操作等等)。

  NetDriver 在收到 NetIO 分發的數據包后,經過適當的轉換和處理,再分發給注冊
  到該 NetDriver 上的所有 NetHandler。
}

  TNetDriver = class(TObject)
  private
    FNetIO: TNetIO;                     // 所屬 NetIO
    FNetHandlerList: TList;             // TNetHandler[]
  private
    procedure RegisterNetHandler(const NetHandler: TNetHandler);
    procedure UnregisterNetHandler(const NetHandler: TNetHandler);
  protected
    // 數據包過濾函數 (返回: True-有效包, False-無效包)
    function FilterUdpPacket(const PacketBuffer; PacketSize: Integer): Boolean; virtual;
    function FilterTcpPacket(Connection: TTcpConnection; const PacketBuffer;
      PacketSize: Integer): Boolean; virtual;

    // 可供覆寫的數據分派函數
    procedure DispatchUdpPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress); virtual;
    procedure DispatchTcpPacket(Connection: TTcpConnection; const PacketBuffer;
      PacketSize: Integer); virtual;

    // 把數據直接遞送給 NetHandler
    procedure DeliverUdpPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress);
    procedure DeliverTcpPacket(Connection: TTcpConnection; const PacketBuffer;
      PacketSize: Integer);
  public
    constructor Create(ANetIO: TNetIO);
    destructor Destroy; override;

    // 初始化、結束化工作
    procedure Initialize; virtual;
    procedure Finalize; virtual;
    // 登錄、注銷處理
    procedure DoBeforeLogin; virtual;
    procedure DoBeforeLogout; virtual;
    procedure DoAfterLogin; virtual;
    procedure DoAfterLogout; virtual;
    // 垃圾收集
    procedure CollectGarbage; virtual;

    // 供 NetIO 調用的UDP數據分派函數 (執行線程: TImUdpListenerThread)
    procedure ProcessRecvedUdpPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress);

    property NetIO: TNetIO read FNetIO;
  end;

{ TNetHandler }
{
  NetHandler用于接收來自 NetDriver 的數據,并進行應用層業務邏輯處理。
  一般來說,它只需和 NetDriver 打交道,接收來自 NetDriver 的數據,并調用
  NetDriver 提供的方法來發送數據。

  如果由于程序邏輯需要(比如模塊劃分),希望將 NetHandler 收到的數據進行再次
  分派,可以在 NetHandler 上注冊 NetDispatcher。當然,NetHandler 也可以自己
  接管數據,不再分派。
}

  TNetHandler = class(TObject)
  private
    FNetDriver: TNetDriver;             // 所屬 NetDriver

    procedure SetNetDriver(Value: TNetDriver);
  protected
    procedure DispatchUdpPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress); virtual;
    procedure DispatchTcpPacket(Connection: TTcpConnection; const PacketBuffer;
      PacketSize: Integer); virtual;
  public
    constructor Create; virtual;
    destructor Destroy; override;

    // 初始化、結束化工作
    procedure Initialize; virtual;
    procedure Finalize; virtual;
    // 登錄、注銷處理
    procedure DoBeforeLogin; virtual;
    procedure DoBeforeLogout; virtual;
    procedure DoAfterLogin; virtual;
    procedure DoAfterLogout; virtual;
    // 垃圾收集
    procedure CollectGarbage; virtual;

    // 取得或設置所屬 NetDriver
    property NetDriver: TNetDriver read FNetDriver write SetNetDriver;
  end;

implementation

{ TNetIO }

constructor TNetIO.Create;
begin
  inherited Create;

  FNetDriverList := TList.Create;
  FUdpServer := TUdpServer.Create;

  FUdpServer.OnRecvData := DoOnUdpServerRecvData;
end;

destructor TNetIO.Destroy;
begin
  FNetDriverList.Free;
  FUdpServer.Free;
  inherited;
end;

//-----------------------------------------------------------------------------
// 描述: 注冊 NetDriver
//-----------------------------------------------------------------------------
procedure TNetIO.RegisterNetDriver(NetDriver: TNetDriver);
begin
  if FNetDriverList.IndexOf(Pointer(NetDriver)) = -1 then
    FNetDriverList.Add(NetDriver);
end;

//-----------------------------------------------------------------------------
// 描述: 注銷 NetDriver
//-----------------------------------------------------------------------------
procedure TNetIO.UnregisterNetDriver(NetDriver: TNetDriver);
begin
  FNetDriverList.Remove(NetDriver);
end;

//-----------------------------------------------------------------------------
// 描述: 取得空閑UDP端口號
// 參數:
//   StartPort  - 起始端口號
//   CheckTimes - 檢測次數
// 返回:
//   空閑端口號 (若失敗則返回 0)
//-----------------------------------------------------------------------------
function TNetIO.GetFreeUdpPort(StartPort, CheckTimes: Integer): Integer;
begin
  Result := GetFreePort(nptUdp, StartPort, CheckTimes);
end;

//-----------------------------------------------------------------------------
// 描述: 初始化UDP服務器
// 參數:
//   UdpPortStart   - 起始 UDP 端口
//   CheckPortTimes - 從起始端口開始,嘗試掃描多少個端口 (若為0,則表示固定端口)
//-----------------------------------------------------------------------------
function TNetIO.InitUdpServer(UdpPortStart, CheckPortTimes: Integer): Boolean;
const
  RetryTimes = 5;
var
  I, Port: Integer;
begin
  for I := 1 to RetryTimes do
  begin
    if CheckPortTimes > 0 then
      Port := GetFreeUdpPort(UdpPortStart, CheckPortTimes)
    else
      Port := UdpPortStart;

    Result := (Port <> 0);
    if Result then
    begin
      try
        FUdpServer.Active := False;
        FUdpServer.LocalPort := Port;
        FUdpServer.Active := True;
        Break;
      except
        Result := False;
      end;
    end;
  end;
end;

//-----------------------------------------------------------------------------
// 描述: FUdpServer 的數據接收事件處理
//-----------------------------------------------------------------------------
procedure TNetIO.DoOnUdpServerRecvData(Sender: TObject; const PacketBuffer;
  PacketSize: Integer; const PeerAddr: TPeerAddress);
begin
  ProcessRecvedUdpPacket(PacketBuffer, PacketSize, PeerAddr);
end;

//-----------------------------------------------------------------------------
// 描述: 初始化UDP服務器
// 參數:
//   UdpPortStart   - 起始 UDP 端口
//   CheckPortTimes - 從起始端口開始,嘗試掃描多少個端口 (若為0,則表示固定端口)
// 返回:
//   True  - 成功
//   False - 失敗
//-----------------------------------------------------------------------------
function TNetIO.InitServer(UdpPortStart, CheckPortTimes: Integer): Boolean;
begin
  Result := InitUdpServer(UdpPortStart, CheckPortTimes);
  if not Result then
    FUdpServer.Active := False;
end;

//-----------------------------------------------------------------------------
// 描述: 停止服務器
//-----------------------------------------------------------------------------
procedure TNetIO.StopServer;
begin
  FUdpServer.Close;
end;

//-----------------------------------------------------------------------------
// 描述: NetIO 收到 UDP 包后,分派給 NetDriver.
//-----------------------------------------------------------------------------
procedure TNetIO.ProcessRecvedUdpPacket(const PacketBuffer; PacketSize: Integer;
  const PeerAddr: TPeerAddress);
var
  I: Integer;
begin
  if PacketSize <= 0 then Exit;

  for I := 0 to FNetDriverList.Count - 1 do
    TNetDriver(FNetDriverList[I]).ProcessRecvedUdpPacket(PacketBuffer, PacketSize, PeerAddr);
end;

{ TNetDriver }

constructor TNetDriver.Create(ANetIO: TNetIO);
begin
  inherited Create;
  FNetIO := ANetIO;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品少妇一区二区三区免费观看 | 国产亚洲精品7777| 麻豆高清免费国产一区| 国产亚洲精品久| 不卡的电影网站| 五月天国产精品| 中文字幕va一区二区三区| 欧美另类z0zxhd电影| 色噜噜狠狠色综合欧洲selulu| 婷婷综合另类小说色区| 亚洲一区在线观看网站| 午夜免费久久看| 日韩视频免费观看高清完整版在线观看 | 日韩免费在线观看| 精品一区中文字幕| 欧美国产综合色视频| 欧美日韩专区在线| 国产成a人无v码亚洲福利| 青娱乐精品视频| 午夜精品福利一区二区三区av| 成人欧美一区二区三区小说| 久久综合九色综合97婷婷 | 99久久综合色| 麻豆成人在线观看| 日本午夜一区二区| 亚洲国产日韩综合久久精品| 亚洲女同一区二区| 国产精品高潮呻吟| 中文字幕一区二| 亚洲精品ww久久久久久p站| 亚洲日本一区二区三区| 日本欧美肥老太交大片| 国产精品家庭影院| 麻豆freexxxx性91精品| 色综合久久99| 久久老女人爱爱| 天天色 色综合| 99视频热这里只有精品免费| 欧美日韩第一区日日骚| 精品国产不卡一区二区三区| 欧美韩国日本综合| 日韩国产欧美三级| 丁香亚洲综合激情啪啪综合| 日本高清免费不卡视频| 欧美va亚洲va| 亚洲综合色在线| 国产91在线看| 日韩午夜激情视频| 亚洲国产欧美日韩另类综合 | 欧美成人a视频| 亚洲色图清纯唯美| 大白屁股一区二区视频| 在线成人免费视频| 一区二区三区成人在线视频| 黄色日韩三级电影| 欧美一区三区四区| 亚洲成人先锋电影| 日本精品视频一区二区三区| 中文字幕的久久| 国产高清不卡一区二区| 日韩写真欧美这视频| 天天综合天天做天天综合| 在线观看欧美日本| 亚洲香蕉伊在人在线观| 在线免费观看日本欧美| 亚洲国产日韩av| 欧美久久一区二区| 日韩国产精品久久久久久亚洲| 欧美图片一区二区三区| 亚洲成人免费看| 日韩欧美一区在线| 久久疯狂做爰流白浆xx| 久久综合九色综合久久久精品综合 | 日韩av一区二区在线影视| 欧美日韩精品一区二区三区 | 国产精品三级在线观看| 9l国产精品久久久久麻豆| 亚洲专区一二三| 91精品国产一区二区| 国产高清精品久久久久| 亚洲免费色视频| 欧美大片在线观看一区| 懂色av一区二区三区免费看| 亚洲一区二区五区| 国产网红主播福利一区二区| 91捆绑美女网站| 蜜臀av性久久久久蜜臀aⅴ流畅| 久久综合国产精品| 在线视频你懂得一区二区三区| 精品制服美女久久| 一区二区三区精密机械公司| 2020国产精品自拍| 欧美精品在线观看一区二区| 成人性色生活片| 另类中文字幕网| 丝袜亚洲精品中文字幕一区| 国产精品久久久久影院老司| 久久婷婷成人综合色| 91精品视频网| 欧美久久免费观看| 欧洲一区在线电影| 欧洲一区二区三区在线| www.av精品| 成人一级片在线观看| 久久精品国产99久久6| 日本特黄久久久高潮| 国产美女视频一区| 高清在线不卡av| 99亚偷拍自图区亚洲| 91麻豆国产福利在线观看| 成人黄色一级视频| 美女视频黄 久久| 精品欧美一区二区三区精品久久 | 欧美日韩在线一区二区| 欧美一区国产二区| 综合久久给合久久狠狠狠97色| 国产精品美女久久久久久久| 亚洲美女在线一区| 人人爽香蕉精品| 丰满少妇久久久久久久| 91免费视频观看| 欧美区视频在线观看| 精品日韩在线观看| 久久久不卡网国产精品一区| 欧美国产日韩精品免费观看| 亚洲精品一二三| 五月婷婷综合激情| 福利视频网站一区二区三区| 色综合久久综合中文综合网| 欧美日韩三级一区| 亚洲精品免费电影| 成人午夜看片网址| 久久精品欧美一区二区三区不卡| 亚洲曰韩产成在线| 午夜精品久久久久久久蜜桃app| 韩国精品在线观看| 91精品国产91久久综合桃花| 国产精品不卡在线| 国产成人av自拍| 91精品国产一区二区人妖| 自拍偷拍国产精品| 麻豆成人免费电影| 欧美精品在线视频| 一区二区三区在线视频免费观看| 国产综合成人久久大片91| 欧美人xxxx| 亚洲午夜久久久久中文字幕久| 色成年激情久久综合| 中文字幕欧美一| av一区二区三区| 中文字幕一区不卡| 色婷婷激情综合| 日韩av高清在线观看| 久久亚洲精品小早川怜子| 成人av免费观看| 亚洲午夜激情av| 精品免费日韩av| 色综合久久综合中文综合网| 美女脱光内衣内裤视频久久网站| 国产精品久久久久久久久快鸭| 欧美日产在线观看| 色屁屁一区二区| 激情综合五月天| 精品粉嫩超白一线天av| 国产精品一区二区在线播放| 国产香蕉久久精品综合网| 波波电影院一区二区三区| 亚洲乱码精品一二三四区日韩在线 | 色天天综合久久久久综合片| 亚洲国产精品一区二区久久| 国产精品久久看| 欧美精品久久久久久久多人混战 | 自拍视频在线观看一区二区| 欧美日韩一区二区在线观看| 99re热视频精品| 午夜久久电影网| 国产日产欧美一区二区三区| 欧美精品xxxxbbbb| 成人一区二区三区视频| 日本不卡在线视频| 一片黄亚洲嫩模| 中文字幕欧美三区| 亚洲精品一区二区三区蜜桃下载| 成人h动漫精品| 精品一区二区三区蜜桃| 天天综合色天天综合| 亚洲444eee在线观看| 一区二区三区在线观看欧美| 国产精品女上位| 国产精品国产三级国产| 国产精品色婷婷| 国产精品美女久久久久久2018| 精品国产一区二区三区不卡| 欧美一区二区播放| 日韩一区二区电影在线| 91精品黄色片免费大全| 6080亚洲精品一区二区| 欧美日韩国产一级片| 日韩一区二区三区观看| 欧美v亚洲v综合ⅴ国产v|