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

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

?? nhcbiznetdriver.pas

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

{*************************************************************************}
{ 單元說明: 常規業務通訊 NetDriver 實現 (UDP、TCP)                        }
{ ----------------------------------------------------------------------- }
{ 注意事項:                                                               }
{                                                                         }
{   1. TBizNetDriver 提供的所有函數調用都為非阻塞式,操作結果以事件形式   }
{      進行回調。                                                         }
{   2. 調用 TBizNetDriver.SendUdpPacket 系列函數時,調用者創建 Packet     }
{      對象并傳入后,無需釋放該對象,NetDriver 會負責釋放它。在事件回調   }
{      時,調用者可在事件參數 PacketTask 中找到該 Packet 對象。           }
{   4. 調用 TBizNetDriver.TransferTcpData 函數,并通過事件成功獲得        }
{      一個 TTcpConnection 對象后,此連接對象不再由 NetDriver 管理,      }
{      故調用者必須負責釋放此連接對象。                                   }
{   5. 調用 TBizNetDriver.SendUdpPacket / TransferTcpData 函數,          }
{      并傳入事件(OnTaskResult, OnTaskResult)后,在事件激活前,若需銷毀調 }
{      用者對象,則必須先調用TBizNetDriver.CancelXXXRequest(Caller) 函數。}
{                                                                         }
{*************************************************************************}

unit NhcBizNetDriver;

interface

uses
  Windows, SysUtils, Classes, NhContainers, NhSocketObj, NhWinSock2,
  NhcNetBase, NhBaseBizPacket, NhThreadPsr, NhClasses, NhcNetClasses,
  NhBasePacket, NhPubUtils;

const
  DefUdpSendTryTimes        = 3;          // 發送UDP包的默認重試次數
  DefUdpSendRecvTimeout     = 1000*3;     // 等待接收UDP包的默認時限(毫秒)

  MaxChkDupSeqsPerSender    = 100;        // 在檢測重復包時,每個用戶保存最近多少數據包記錄
  MaxUdpPacketCacheSize     = 10000;      // UDP數據包緩沖器的最大容量
  MaxTcpPacketCacheSize     = 10000;      // TCP數據包緩沖器的最大容量

  TcpConnectTimeout         = 1000*10;    // TCP正向連接超時時間(毫秒)
  TcpRecvPacketTimeout      = 1000*20;    // TCP接收數據包的超時時間(毫秒)

type

{ Classes }

  TUdpTask = class;
  TUdpSendPacketTask = class;
  TUdpSendRecvPacketTask = class;
  TUdpTaskList = class;
  TUdpTaskExecutor = class;
  TNetDriverFollowProcessor = class;
  TTcpTask = class;
  TTcpTaskList = class;
  TTcpTaskExecutor = class;
  TBizNetDriver = class;

{ Types }

  // 任務狀態
  TNetDriverTaskStatus = set of (
    tsDone,                             // 任務結束
    tsSuccess                           // 任務成功完成
    );

  // UDP發送結果事件
  TUdpTaskResultEvent = procedure(Task: TUdpTask) of object;
  // TCP連接結果事件
  TTcpTaskResultEvent = procedure(Task: TTcpTask) of object;

{ TUdpTask - UDP數據包發送任務基類 }

  TUdpTask = class(TObject)
  private
    FCaller: TObject;                   // 調用者對象
    FOnTaskResult: TUdpTaskResultEvent; // 發送結果事件
  protected
    FReqPacket: TBizUdpPacket;          // 請求包(已Pack,由調用者創建,NetDriver 負責釋放)
    FAckPacket: TBufferStream;          // 應答包
    FAckPeerAddr: TPeerAddress;         // 應答包的來自地址
    FPeerAddr: TPeerAddress;            // 目的地址
    FTaskStatus: TNetDriverTaskStatus;  // 任務狀態
  protected
    function GetDone: Boolean;
    function GetSuccess: Boolean;

    property Done: Boolean read GetDone;
  public
    constructor Create; virtual;
    destructor Destroy; override;

    // 執行發送任務
    procedure Process; virtual; abstract;
    // 處理應答包
    procedure ProcessAckPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress; var Handled: Boolean); virtual;

    property ReqPacket: TBizUdpPacket read FReqPacket;
    property AckPacket: TBufferStream read FAckPacket;
    property AckPeerAddr: TPeerAddress read FAckPeerAddr;
    property PeerAddr: TPeerAddress read FPeerAddr;
    property Success: Boolean read GetSuccess;
  end;

{ TUdpSendPacketTask - UDP數據包發送任務 (僅發送) }

  TUdpSendPacketTask = class(TUdpTask)
  private type
    TUdpSendPacketTaskParams = record
      SendTimes: Integer;             // 總共需發送幾次
    end;
  private
    FTaskParams: TUdpSendPacketTaskParams;
  public
    procedure InitParams(Packet: TBizUdpPacket; const PeerAddr: TPeerAddress;
      SendTimes: Integer; OnTaskResult: TUdpTaskResultEvent);

    procedure Process; override;
  end;

{ TUdpSendRecvPacketTask - UDP數據包發送任務 (發送并接收) }

  TUdpSendRecvPacketTask = class(TUdpTask)
  private type
    TUdpSendRecvPacketTaskParams = record
      SendTimes: Integer;             // 最多發送幾次
      RecvTimeout: Integer;           // 每次等待應答的最長時間(毫秒)
      ForwardTimes: Integer;          // 需轉發的次數
    end;

    TUdpSendRecvPacketTaskCtrl = record
      SentTimes: Integer;             // 已發送次數
      LastSendTicks: Cardinal;        // 上次發送時間
    end;
  private
    FTaskParams: TUdpSendRecvPacketTaskParams;
    FTaskCtrl: TUdpSendRecvPacketTaskCtrl;
  public
    procedure InitParams(Packet: TBizUdpPacket; const PeerAddr: TPeerAddress;
      SendTimes, RecvTimeout: Integer; OnTaskResult: TUdpTaskResultEvent);

    procedure Process; override;
    procedure ProcessAckPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress; var Handled: Boolean); override;
  end;

{ TUdpTaskList - UDP發送任務列表 }

  TUdpTaskList = class(TCustomObjectList)
  private
    function GetItems(Index: Integer): TUdpTask;

    function FindTask(PacketSeqNumber: Cardinal): TUdpTask; overload;
    function FindTask(Caller: TObject): TUdpTask; overload;
    function FindTask(OnTaskResult: TUdpTaskResultEvent): TUdpTask; overload;
  public
    constructor Create;
    destructor Destroy; override;

    procedure Add(Task: TUdpTask);
    procedure Remove(Task: TUdpTask);
    procedure Delete(Index: Integer);
    function Extract(Index: Integer): TUdpTask;
    procedure Clear;

    procedure RemoveTasks(PacketSeqNumber: Cardinal); overload;
    procedure RemoveTasks(Caller: TObject); overload;
    procedure RemoveTasks(OnTaskResult: TUdpTaskResultEvent); overload;
    procedure CancelResultEvent(Caller: TObject);

    property Items[Index: Integer]: TUdpTask read GetItems; default;
  end;

{ TUdpTaskExecutor - UDP數據包發送執行器 }
{
  職責:
  1. 處理UDP數據包發送任務,對不同類型的任務采取不同的發送策略。
  2. 將執行完的任務轉移到 TBizNetDriver.FUdpDoneTaskList 中,以便進行事件處理。
}

  TUdpTaskExecutor = class(TObject)
  private
    FTaskList: TUdpTaskList;      // 正在發送中的任務列表
  public
    constructor Create;
    destructor Destroy; override;

    procedure AddReqPacket(Packet: TBizUdpPacket;
      const PeerAddr: TPeerAddress; NeedAck: Boolean;
      OnTaskResult: TUdpTaskResultEvent; Caller: TObject;
      SendTimes, RecvTimeout: Integer);
    procedure ProcessAckPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress);
    procedure RemoveReqPacket(PacketSeqNumber: Cardinal); overload;
    procedure RemoveReqPacket(Caller: TObject); overload;
    procedure RemoveReqPacket(OnTaskResult: TUdpTaskResultEvent); overload;
    procedure CancelResultEvent(Caller: TObject);
    procedure Clear;

    procedure Execute;
  end;

{ TUdpPacketDupChecker - 重復包檢測器 }

  TUdpPacketDupChecker = class(TSyncObject)
  private
    FActionCodes: TList;                // 需要過濾的數據包的ActionCode
    FSenders: TIntMap;                  // 用戶列表(Key:用戶號碼, Value:TList)

    function IsRegActionCode(ActionCode: Integer): Boolean;
  protected
    function BeforeCheck(const PacketHeader; var SenderID, SeqNumber,
      ActionCode: Integer): Boolean; virtual;
  public
    constructor Create;
    destructor Destroy; override;

    procedure RegisterActionCode(ActionCode: Integer);
    procedure UnregisterActionCode(ActionCode: Integer);

    function Check(const PacketHeader): Boolean;
    procedure ClearUser(SenderID: Integer);
    procedure Clear;
  end;

{ TTcpTask }

  // TCP連接任務狀態
  TTcpTaskState = (
    ttsConnect,                // 發起連接
    ttsWaitConnect,            // 等待連接成功
    ttsSendReqPacket,          // 發送請求包
    ttsWaitAckPacket           // 等待應答包
    );

  TTcpTask = class(TObject)
  private
    FExecutor: TTcpTaskExecutor;          // 所屬 TcpTaskExecutor
    FCaller: TObject;                     // 調用者對象
    FOnTaskResult: TTcpTaskResultEvent;   // 結果事件
    FPeerAddr: TPeerAddress;              // 目的地址
    FConnection: TTcpConnection;          // TCP 連接 (由 NetDriver 創建,Caller 負責釋放)
    FReqPacket: TBizTcpPacket;            // 請求包(已Pack,由調用者創建,NetDriver 負責釋放)
    FAckPacket: TBufferStream;            // 應答包
    FNeedAck: Boolean;                    // 是否需要接收應答包
    FNeedConnect: Boolean;                // 是否需要發起連接
    FTaskStatus: TNetDriverTaskStatus;    // 任務狀態
    FSocketError: Boolean;                // 套接字是否發生了錯誤
    FState: TTcpTaskState;
    FLastStateTicks: Cardinal;
    FReqPacketSentSize: Integer;
  private
    function GetDone: Boolean;
    function GetSuccess: Boolean;
    procedure CancelResultEvent;
    procedure SetState(Value: TTcpTaskState);
    procedure SetNeedSleep(Value: Boolean);

    procedure DoStateConnect;
    procedure DoStateWaitConnect;
    procedure DoStateSendReqPacket;
    procedure DoStateWaitAckPacket;

    property Done: Boolean read GetDone;
  public
    constructor Create; virtual;
    destructor Destroy; override;

    procedure InitParams(Executor: TTcpTaskExecutor;
      const PeerAddr: TPeerAddress; Connection: TTcpConnection;
      ReqPacket: TBizTcpPacket; NeedAck: Boolean; Caller: TObject;
      OnTaskResult: TTcpTaskResultEvent);

    // 執行連接和發送任務
    procedure Process; virtual;
    // 處理應答包
    procedure ProcessAckPacket(const PacketBuffer; PacketSize: Integer;
      var Handled: Boolean); virtual;

    property ReqPacket: TBizTcpPacket read FReqPacket;
    property AckPacket: TBufferStream read FAckPacket;
    property PeerAddr: TPeerAddress read FPeerAddr;
    property Connection: TTcpConnection read FConnection;
    property Success: Boolean read GetSuccess;
    property SocketError: Boolean read FSocketError;
  end;

{ TTcpTaskList - TCP連接任務列表 }

  TTcpTaskList = class(TCustomObjectList)
  private
    function GetItems(Index: Integer): TTcpTask;

    function FindTask(Caller: TObject): TTcpTask; overload;
    function FindTask(OnTaskResult: TTcpTaskResultEvent): TTcpTask; overload;
  public
    constructor Create;
    destructor Destroy; override;

    procedure Add(Task: TTcpTask);
    procedure Remove(Task: TTcpTask);
    procedure Delete(Index: Integer);
    function Extract(Index: Integer): TTcpTask;
    procedure Clear;

    procedure SetSocketError(Connection: TTcpConnection; SocketError: Boolean);
    procedure RemoveTasks(Caller: TObject); overload;
    procedure RemoveTasks(OnTaskResult: TTcpTaskResultEvent); overload;
    procedure CancelResultEvent(Caller: TObject);

    property Items[Index: Integer]: TTcpTask read GetItems; default;
  end;

{ TTcpTaskExecutor }

  TTcpTaskExecutor = class(TObject)
  private
    FTaskList: TTcpTaskList;     // 正在工作中的任務列表
  public
    constructor Create;
    destructor Destroy; override;

    procedure AddRequest(const PeerAddr: TPeerAddress;
      Connection: TTcpConnection; ReqPacket: TBizTcpPacket; NeedAck: Boolean;
      Caller: TObject; OnTaskResult: TTcpTaskResultEvent);
    procedure ProcessAckPacket(const PacketBuffer; PacketSize: Integer);
    procedure AddTask(Task: TTcpTask);
    procedure RemoveRequest(Caller: TObject); overload;
    procedure RemoveRequest(OnTaskResult: TTcpTaskResultEvent); overload;
    procedure CancelResultEvent(Caller: TObject);
    procedure SetSocketError(Connection: TTcpConnection; SocketError: Boolean);
    procedure Clear;

    procedure Execute;
  end;

{ TTcpPacketReceiver - TCP數據包接收器 }

  TTcpPacketReceiver = class(TObject)
  private
    FConnection: TTcpConnection;          // TCP連接
    FBuffer: TBufferStream;               // 接收緩存
    FMaxRecvPktCount: Integer;            // 最多接收數據包個數
    FCurRecvPktCount: Integer;            // 當前已接收數據包個數
    FDone: Boolean;                       // 任務是否已完成
  private
    procedure RecvPacket;
  public
    constructor Create(Connection: TTcpConnection; MaxRecvPktCount: Integer);
    destructor Destroy; override;
    procedure Process;
    property Done: Boolean read FDone;
  end;

{ TTcpPacketRecverList - TCP數據包接收器列表 }

  TTcpPacketRecverList = class(TSyncObject)
  private
    FRecverList: TObjectList;      // TTcpPacketReceiver[]
  private
    function FindConnection(Connection: TTcpConnection): Integer;
  public
    constructor Create;
    destructor Destroy; override;

    procedure AddConnection(Connection: TTcpConnection; MaxRecvPktCount: Integer);
    procedure RemoveConnection(Connection: TTcpConnection);

    procedure Process;
  end;

{ TNetDriverExecuteProcessor - NetDriver 執行處理器 }

  TNetDriverExecuteProcessor = class(TBcThreadProcessor)
  protected
    procedure Process; override;
  public
    constructor Create;
    destructor Destroy; override;
  end;

{ TNetDriverFollowProcessor - NetDriver 后繼處理器 }
{
  職責:
  1. 將 NetIO 分派過來的UDP包,以 sync 方式繼續分派。
  2. 以 sync 方式調用UDP的 "發送結果事件" 和TCP的 "連接結果事件"。
}

  TNetDriverFollowProcessor = class(TBcThreadProcessor)
  private
    procedure ProcessUdpPacketCache;
    procedure ProcessUdpDoneTaskList;
    procedure ProcessTcpPacketCache;
    procedure ProcessTcpDoneTaskList;
  protected
    procedure Process; override;
  public
    constructor Create;
    destructor Destroy; override;
  end;

{ TBizNetDriver }

  TBizNetDriver = class(TNetDriver)
  private
    FUdpTaskExecutor: TUdpTaskExecutor;             // UDP數據包發送執行器
    FUdpSeqIdAlloc: TSeqAllocator;                  // UDP數據包順序號分配器
    FUdpPacketCache: TUdpPacketCache;               // UDP數據包緩沖器(用于緩存收到的UDP包)
    FUdpDoneTaskList: TUdpTaskList;                 // 已結束的UDP發送任務的列表
    FUdpDupChecker: TUdpPacketDupChecker;           // UDP重復包檢測器

    FTcpTaskExecutor: TTcpTaskExecutor;             // TCP連接執行器
    FTcpDoneTaskList: TTcpTaskList;                 // 已結束的TCP連接任務
    FTcpPacketRecverList: TTcpPacketRecverList;     // TCP數據包接收器
    FTcpPacketCache: TTcpPacketCache;               // TCP數據包緩沖器(用于緩存收到的TCP包)

    FExecuteProcessor: TNetDriverExecuteProcessor;  // NetDriver 執行處理器
    FFollowProcessor: TNetDriverFollowProcessor;    // NetDriver 后繼處理器
  private
    procedure InitDupPktChkActionCodes;

    procedure PerformSendUdpPacket(Packet: TPacket;
      const PeerAddr: TPeerAddress; SendTimes: Integer = 1);
    procedure DoProcessUdpAckPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress);
    procedure DoProcessTcpAckPacket(Connection: TTcpConnection;
      const PacketBuffer; PacketSize: Integer);
  protected
    function FilterUdpPacket(const PacketBuffer; PacketSize: Integer): Boolean; override;
    procedure DispatchUdpPacket(const PacketBuffer; PacketSize: Integer;
      const PeerAddr: TPeerAddress); override;
    procedure DispatchTcpPacket(Connection: TTcpConnection; const PacketBuffer;
      PacketSize: Integer); override;
  public
    procedure Initialize; override;
    procedure Finalize; override;
    procedure DoBeforeLogin; override;
    procedure DoBeforeLogout; override;
    procedure DoAfterLogin; override;
    procedure DoAfterLogout; override;
    procedure CollectGarbage; override;
  public

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区免费av| 亚洲美女视频在线观看| 91蜜桃视频在线| av午夜一区麻豆| 91麻豆免费在线观看| 色噜噜狠狠成人中文综合| 91丨九色丨黑人外教| 国产经典欧美精品| 国产91精品露脸国语对白| 99久久婷婷国产| 欧美色老头old∨ideo| 欧美日韩免费一区二区三区视频| 欧美在线免费视屏| 欧美一区二区私人影院日本| 精品国产a毛片| 中文字幕精品一区| 亚洲一区二区三区四区在线| 三级欧美在线一区| 国产综合久久久久久鬼色| 成人av在线播放网站| 色偷偷久久一区二区三区| 欧美人与性动xxxx| 久久久久国产精品人| 亚洲色图19p| 麻豆91免费看| 91免费看`日韩一区二区| 欧美日韩中文字幕一区二区| 日韩美女主播在线视频一区二区三区 | 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲电影欧美电影有声小说| 狠狠色丁香久久婷婷综合_中 | 视频一区中文字幕国产| 亚洲蜜臀av乱码久久精品| 亚洲精品国产第一综合99久久| 亚洲国产裸拍裸体视频在线观看乱了| 日韩精品亚洲专区| 国产精品 欧美精品| 欧美日韩国产综合草草| 国产欧美日韩另类一区| 五月婷婷综合在线| 99久久久国产精品| 欧美岛国在线观看| 亚洲一卡二卡三卡四卡无卡久久| 国产在线精品不卡| 欧美日韩国产bt| 最新国产成人在线观看| 视频一区欧美精品| 色婷婷av一区二区三区大白胸| 日韩欧美一二三| 亚洲宅男天堂在线观看无病毒| 激情图片小说一区| 日本久久精品电影| 中文文精品字幕一区二区| 日韩黄色在线观看| 91蜜桃在线观看| 精品国产伦理网| 免费人成黄页网站在线一区二区| 色婷婷久久久综合中文字幕| 国产精品久久夜| 成人一区二区三区在线观看| 精品国产一区二区亚洲人成毛片| 视频在线观看91| 欧美精品在线一区二区| 亚洲一区二区三区在线播放| 日韩精品专区在线| 天堂成人国产精品一区| 欧美中文字幕不卡| 亚洲精品免费在线播放| 91亚洲精品久久久蜜桃网站| 欧美激情艳妇裸体舞| 国产真实乱偷精品视频免| 日韩女优电影在线观看| 另类调教123区| 日韩一级精品视频在线观看| 五月激情丁香一区二区三区| 欧美日韩亚洲综合在线| 亚洲一二三级电影| 在线观看免费视频综合| 亚洲国产一区二区三区| 91精品国产色综合久久ai换脸| 婷婷综合五月天| 日韩一区二区影院| 日本午夜一区二区| 精品日韩在线一区| 丰满放荡岳乱妇91ww| 国产精品久久久久三级| 色偷偷久久人人79超碰人人澡 | 一区二区三区**美女毛片| 成人av网在线| 亚洲男女一区二区三区| 欧美日韩国产另类一区| 天天射综合影视| 日韩西西人体444www| 国产老妇另类xxxxx| 国产精品欧美经典| 色av成人天堂桃色av| 亚洲成人资源网| 337p日本欧洲亚洲大胆精品| 99这里只有久久精品视频| 亚洲午夜久久久久久久久久久| 欧美夫妻性生活| 国产成人福利片| 亚洲超碰精品一区二区| 久久一日本道色综合| 91久久精品日日躁夜夜躁欧美| 天堂资源在线中文精品| 久久综合九色欧美综合狠狠| 波多野结衣在线一区| 青青青爽久久午夜综合久久午夜| 精品国产亚洲一区二区三区在线观看 | 国产视频亚洲色图| 色哟哟一区二区三区| 久久9热精品视频| 欧美国产一区二区在线观看| 欧美高清一级片在线| 成人免费看的视频| 视频一区二区三区在线| 亚洲私人影院在线观看| 欧美tickling网站挠脚心| 色综合久久88色综合天天6| 极品美女销魂一区二区三区 | 中文字幕精品—区二区四季| 欧美日韩久久一区| 暴力调教一区二区三区| 精品无人码麻豆乱码1区2区| 亚洲一线二线三线视频| 国产精品人人做人人爽人人添| 日韩无一区二区| 色八戒一区二区三区| 不卡av在线免费观看| 国产一区二区三区久久悠悠色av| 国产成人免费视频一区| 91精品国产欧美一区二区18| 久久精品国产99| 亚洲中国最大av网站| 亚洲天堂网中文字| 国产网站一区二区| 精品国产人成亚洲区| 欧美二区在线观看| 精品1区2区3区| 在线免费观看一区| 91色在线porny| caoporm超碰国产精品| 国产成人av福利| 国产成人亚洲综合a∨婷婷图片| 久久精品国产**网站演员| 日韩成人免费电影| 偷窥国产亚洲免费视频| 午夜精品国产更新| 日本不卡不码高清免费观看| 日韩高清不卡一区| 蜜桃av噜噜一区二区三区小说| 天堂蜜桃一区二区三区| 日韩1区2区日韩1区2区| 免费观看成人av| 国内精品视频一区二区三区八戒 | 色婷婷久久久久swag精品| 91在线一区二区三区| 在线看国产日韩| 51午夜精品国产| 精品人伦一区二区色婷婷| 26uuu亚洲综合色| 中文字幕乱码一区二区免费| 亚洲婷婷综合色高清在线| 亚洲影院在线观看| 免费观看一级特黄欧美大片| 国产在线精品免费av| a美女胸又www黄视频久久| 不卡的av电影| 欧美精品乱码久久久久久按摩| 欧美一区永久视频免费观看| 久久久精品tv| 亚洲天堂网中文字| 日韩精品一二区| 国产91丝袜在线18| 在线免费亚洲电影| 久久先锋影音av| 亚洲综合色网站| 久久国产精品无码网站| yourporn久久国产精品| 欧美日韩国产小视频在线观看| 精品国产免费一区二区三区香蕉| 中文字幕一区二| 久久99在线观看| 欧洲另类一二三四区| 欧美在线小视频| 久久久久久一二三区| 色综合久久天天| 99久久久国产精品| 精品捆绑美女sm三区| 国产精品乱人伦| 国产成人鲁色资源国产91色综 | 97精品视频在线观看自产线路二| 国产精品女主播在线观看| 亚洲精品国久久99热| 樱桃视频在线观看一区| 99精品国产99久久久久久白柏 | 天堂一区二区在线免费观看| 欧美一区二区三区视频在线 | 3atv在线一区二区三区|