亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

用Delphi設(shè)計代理服務(wù)器

2019-11-18 18:45:55
字體:
供稿:網(wǎng)友

用Delphi設(shè)計自己的代理服務(wù)器

    筆者在編寫一個上網(wǎng)計費軟件時,涉及到如何對局域網(wǎng)中各工作站上網(wǎng)計費問題。一般來講,這些工作站通過代理服務(wù)器上網(wǎng),而采用現(xiàn)成的代理服務(wù)器軟件時,由于代理服務(wù)器軟件是封閉的系統(tǒng),很難編寫程序獲取實時的上網(wǎng)計時信息。因此,考慮是否能編寫自己的代理服務(wù)器,一方面解決群體上網(wǎng),另一方面又解決上網(wǎng)的計費問題呢?
    經(jīng)過實驗性編程,終于圓滿地解決了該問題。現(xiàn)寫出來,與各位同行分享。

1、 思路
當(dāng)前流行的瀏覽器的系統(tǒng)選項中有一個參數(shù),即“通過代理服務(wù)器連接”,經(jīng)過編程測
試,當(dāng)局域網(wǎng)中一臺工作站指定了該屬性,再發(fā)出Internet請求時,請求數(shù)據(jù)將發(fā)送到所指定的代理服務(wù)器上,以下為請求數(shù)據(jù)包示例:
                 GET http://home.microsoft.com/intl/cn/ HTTP/1.0
                 Accept: */*
                 Accept-Language: zh-cn
                 Accept-Encoding: gzip, deflate
                 User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
                 Host: home.microsoft.com
                 PRoxy-Connection: Keep-Alive
其中第一行為目標(biāo)URL及相關(guān)方法、協(xié)議,“Host”行指定了目標(biāo)主機的地址。
由此知道了代理服務(wù)的過程:接收被代理端的請求、連接真正的主機、接收主機返回的數(shù)據(jù)、將接收數(shù)據(jù)發(fā)送到被代理端。
為此可編寫一個簡單的程序,完成上述網(wǎng)絡(luò)通信重定向問題。
用Delphi設(shè)計時,選用ServerSocket作為與被代理工作站通信的套接字控件,選用ClientSocket動態(tài)數(shù)組作為與遠(yuǎn)程主機通信的套接字控件。
編程時應(yīng)解決的一個重要問題是多重連接處理問題,為了加快代理服務(wù)的速度和被代理端的響應(yīng)速度,套接字控件的屬性應(yīng)設(shè)為非阻塞型;各通信會話與套接字動態(tài)綁定,用套接字的SocketHandle屬性值確定屬于哪一個會話。
通信的銜接過程如下圖所示:

                                  代理服務(wù)器
                                 
                                  Serversocket
                        (1)          接  收
         被代理端                   發(fā)  送                        遠(yuǎn)程主機
                        (6)        (2)      (5)
         Browser                  ClientSocket       (4)            Web Server
                                    接  收
                                    發(fā)  送          (3)


(1)、被代理端瀏覽器發(fā)出Web請求,代理服務(wù)器的Serversocket接收到請求。
(2)、代理服務(wù)器程序自動創(chuàng)建一個ClientSocket,并設(shè)置主機地址、端口等屬性,然后連接遠(yuǎn)程主機。
(3)、遠(yuǎn)程連通后激發(fā)發(fā)送事件,將Serversocket接收到的Web請求數(shù)據(jù)包發(fā)送到遠(yuǎn)程主機。
(4)、當(dāng)遠(yuǎn)程主機返回頁面數(shù)據(jù)時,激發(fā)ClientSocket的讀事件,讀取頁面數(shù)據(jù)。
(5)、代理服務(wù)器程序根據(jù)綁定信息確定屬于ServerSocket控件中的哪一個Socket應(yīng)該將從主機接收的頁面信息發(fā)送到被代理端。
(6)、ServerSocket中的對應(yīng)Socket將頁面數(shù)據(jù)發(fā)送到被代理端。

2、 程序編寫
使用Delphi設(shè)計以上通信過程非常簡單,主要是ServerSocket、ClientSocket的相關(guān)事
件驅(qū)動程序的程序編寫。下面給出作者編寫的實驗用代理服務(wù)器界面與源程序清單,內(nèi)含簡要功能說明:

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ScktComp, TrayIcon, Menus, StdCtrls;

type
   session_record=record
      Used: boolean;                       {會話記錄是否可用}
      SS_Handle: integer;                  {代理服務(wù)器套接字句柄}
      CSocket: TClientSocket;              {用于連接遠(yuǎn)程的套接字}
      Lookingup: boolean;                  {是否正在查找服務(wù)器}
      LookupTime: integer;                 {查找服務(wù)器時間}
      Request: boolean;                    {是否有請求}
      request_str: string;                 {請求數(shù)據(jù)塊}
      client_connected: boolean;           {客戶機聯(lián)機標(biāo)志}
      remote_connected: boolean;           {遠(yuǎn)程服務(wù)器連接標(biāo)志}
end;

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    ClientSocket1: TClientSocket;
    Timer2: TTimer;
    TrayIcon1: TTrayIcon;
    PopupMenu1: TPopupMenu;
    N11: TMenuItem;
    N21: TMenuItem;
    N1: TMenuItem;
    N01: TMenuItem;
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Timer1: TTimer;
    procedure Timer2Timer(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N21Click(Sender: TObject);
    procedure N01Click(Sender: TObject);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Write(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocket1Listen(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure AppException(Sender: TObject; E: Exception);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    Service_Enabled: boolean;           {代理服務(wù)是否開啟}
    session: array of session_record;      {會話數(shù)組}
    sessions: integer;                  {會話數(shù)}
    LookUpTimeOut: integer;           {連接超時值}
    InvalidRequests: integer;            {無效請求數(shù)}
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

file://系統(tǒng)啟動定時器,啟動窗顯示完成后,縮小到System Tray…
procedure TForm1.Timer2Timer(Sender: TObject);
begin
   timer2.Enabled:=false;     {關(guān)閉定時器}
   sessions:=0;               {會話數(shù)=0}
   application.OnException := AppException;     {為了屏蔽代理服務(wù)器出現(xiàn)的異常}
   invalidRequests:=0;           {0錯誤}
   LookUpTimeOut:=60000;      {超時值=1分鐘}
   timer1.Enabled:=true;         {打開定時器}
   n11.Enabled:=false;           {開啟服務(wù)菜單項失效}
   n21.Enabled:=true;           {關(guān)閉服務(wù)菜單項有效}
   serversocket1.Port:=988;      {代理服務(wù)器端口=988}
   serversocket1.Active:=true;    {開啟服務(wù)}
   form1.hide;                 {隱藏界面,縮小到System Tray上}
end;

file://開啟服務(wù)菜單項…
procedure TForm1.N11Click(Sender: TObject);
begin
   serversocket1.Active:=true;    {開啟服務(wù)}
end;


file://停止服務(wù)菜單項…
procedure TForm1.N21Click(Sender: TObject);
begin
   serversocket1.Active:=false;      {停止服務(wù)}
   N11.Enabled:=True;
   N21.Enabled:=False;
   Service_Enabled:=false;           {標(biāo)志清零}
end;


file://主窗口建立…
procedure TForm1.FormCreate(Sender: TObject);
begin
   Service_Enabled:=false;
   timer2.Enabled:=true;        {窗口建立時,打開定時器}
end;

file://窗口關(guān)閉時…
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   timer1.Enabled:=false;          {關(guān)閉定時器}
   if Service_Enabled then
      serversocket1.Active:=false;   {退出程序時關(guān)閉服務(wù)}
end;

file://退出程序按鈕…
procedure TForm1.N01Click(Sender: TObject);
begin
   form1.Close;                     {退出程序}
end;

file://開啟代理服務(wù)后…
procedure TForm1.ServerSocket1Listen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   Service_Enabled:=true;            {置正在服務(wù)標(biāo)志}
   N11.Enabled:=false;
   N21.Enabled:=true;
end;

file://被代理端連接到代理服務(wù)器后,建立一個會話,并與套接字綁定…
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j: integer;
begin
   j:=-1;
   for i:=1 to sessions do               {查找是否有空白項}
      if not session[i-1].Used and not session[i-1].CSocket.active then
         begin
            j:=i-1;                      {有,分配它}
            session[j].Used:=true;       {置為在用}
            break;
         end
      else
         if not session[i-1].Used and session[i-1].CSocket.active then
               session[i-1].CSocket.active:=false;
   if j=-1 then
      begin                              {無,新增一個}
         j:=sessions;
         inc(sessions);
         setlength(session,sessions);
         session[j].Used:=true;                        {置為在用}
         session[j].CSocket:=TClientSocket.Create(nil);
         session[j].CSocket.OnConnect:=ClientSocket1Connect;
         session[j].CSocket.OnDisconnect:=ClientSocket1Disconnect;
         session[j].CSocket.OnError:=ClientSocket1Error;
         session[j].CSocket.OnRead:=ClientSocket1Read;
         session[j].CSocket.OnWrite:=ClientSocket1Write;
         session[j].Lookingup:=false;
      end;
   session[j].SS_Handle:=socket.socketHandle;    {保存句柄,實現(xiàn)綁定}
   session[j].Request:=false;                    {無請求}
   session[j].client_connected:=true;            {客戶機已連接}
   session[j].remote_connected:=false;           {遠(yuǎn)程未連接}
   edit1.text:=inttostr(sessions);
end;

file://被代理端斷開時…
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].SS_Handle=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].client_connected:=false;   {客戶機未連接}
            if session[i-1].remote_connected then
               session[i-1].CSocket.active:=false   {假如遠(yuǎn)程尚連接,斷開它}
            else
               session[i-1].Used:=false;           {假如兩者都斷開,則置釋放資源標(biāo)志}
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do                        {統(tǒng)計會話數(shù)組尾部有幾個未用項}
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   if k>0 then                          {修正會話數(shù)組,釋放尾部未用項}
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
end;

file://通信錯誤出現(xiàn)時…
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].SS_Handle=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].client_connected:=false;   {客戶機未連接}
            if session[i-1].remote_connected then
               session[i-1].CSocket.active:=false   {假如遠(yuǎn)程尚連接,斷開它}
            else
               session[i-1].Used:=false;           {假如兩者都斷開,則置釋放資源標(biāo)志}
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   if k>0 then
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
   errorcode:=0;
end;

file://被代理端發(fā)送來頁面請求時…
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
tmp,line,host: string;
i,j,port: integer;
begin
   for i:=1 to sessions do                 {判斷是哪一個會話}
      if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle) then
          begin
             session[i-1].request_str:=socket.ReceiveText;  {保存請求數(shù)據(jù)}
             tmp:=session[i-1].request_str;                 {存放到臨時變量}
             memo1.lines.add(tmp);
             j:=pos(char(13)+char(10),tmp);                 {一行標(biāo)志}
             while j>0 do                       {逐行掃描請求文本,查找主機地址}
                begin
                   line:=copy(tmp,1,j-1);                  {取一行}
                   delete(tmp,1,j+1);                      {刪除一行}
                   j:=pos('Host',line);                    {主機地址標(biāo)志}
                   if j>0 then
                      begin
                         delete(line,1,j+5);               {刪除前面的無效字符}
                         j:=pos(':',line);
                         if j>0 then
                            begin
                               host:=copy(line,1,j-1);
                               delete(line,1,j);
                               try
                                  port:=strtoint(line);
                               except
                                  port:=80;
                               end;
                            end
                         else
                            begin
                               host:=trim(line);                 {獲取主機地址}
                               port:=80;
                            end;
                         if not session[i-1].remote_connected then  {假如遠(yuǎn)征尚未連接}
                            begin
                               session[i-1].Request:=true;      {置請求數(shù)據(jù)就緒標(biāo)志}
                               session[i-1].CSocket.host:=host;  {設(shè)置遠(yuǎn)程主機地址}
                               session[i-1].CSocket.port:=port;     {設(shè)置端口}
                               session[i-1].CSocket.active:=true;   {連接遠(yuǎn)程主機}
                               session[i-1].Lookingup:=true;        {置標(biāo)志}
                               session[i-1].LookupTime:=0;          {從0開始計時}
                            end
                         else
                            {假如遠(yuǎn)程已連接,直接發(fā)送請求}
                            session[i-1].CSocket.socket.sendtext(session[i-1].request_str);                                   
                         break;                        {停止掃描請求文本}
                      end;
                   j:=pos(char(13)+char(10),tmp);           {指向下一行}
                end;
             break;                    {停止循環(huán)}
          end;
end;

file://當(dāng)連接遠(yuǎn)程主機成功時…
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.socket.sockethandle=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].CSocket.tag:=socket.SocketHandle;
            session[i-1].remote_connected:=true;   {置遠(yuǎn)程主機已連通標(biāo)志}
            session[i-1].Lookingup:=false;         {清標(biāo)志}
            break;
         end;
end;


file://當(dāng)遠(yuǎn)程主機斷開時…
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            session[i-1].remote_connected:=false;       {置為未連接}
            if not session[i-1].client_connected then
               session[i-1].Used:=false       {假如客戶機已斷開,則置釋放資源標(biāo)志}
            else
               for k:=1 to serversocket1.Socket.ActiveConnections do
                  if (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used then
                     begin
                        serversocket1.Socket.Connections[k-1].Close;
                        break;
                     end;
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   if k>0 then                        {修正會話數(shù)組}
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
end;

file://當(dāng)與遠(yuǎn)程主機通信發(fā)生錯誤時…
procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
var
i,j,k: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            socket.close;
            session[i-1].remote_connected:=false;       {置為未連接}
            if not session[i-1].client_connected then
               session[i-1].Used:=false        {假如客戶機已斷開,則置釋放資源標(biāo)志}
            else
               for k:=1 to serversocket1.Socket.ActiveConnections do
                  if (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used then
                     begin
                        serversocket1.Socket.Connections[k-1].Close;
                        break;
                     end;
            break;
         end;
   j:=sessions;
   k:=0;
   for i:=1 to j do
      begin
         if session[j-i].Used then
            break;
         inc(k);
      end;
   errorcode:=0;
   if k>0 then                        {修正會話數(shù)組}
      begin
         sessions:=sessions-k;
         setlength(session,sessions);
      end;
   edit1.text:=inttostr(sessions);
end;

file://向遠(yuǎn)程主機發(fā)送頁面請求…
procedure TForm1.ClientSocket1Write(Sender: TObject;
  Socket: TCustomWinSocket);
var
i: integer;
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            if session[i-1].Request then
               begin
                  socket.SendText(session[i-1].request_str);   {假如有請求,發(fā)送}
                  session[i-1].Request:=false;                 {清標(biāo)志}
               end;
            break;
         end;
end;

file://遠(yuǎn)程主機發(fā)來頁面數(shù)據(jù)時…
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
i,j: integer;
rec_bytes: integer;                  {傳回的數(shù)據(jù)塊長度}
rec_Buffer: array[0..2047] of char;  {傳回的數(shù)據(jù)塊緩沖區(qū)}
begin
   for i:=1 to sessions do
      if (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used then
         begin
            rec_bytes:=socket.ReceiveBuf(rec_buffer,2048);    {接收數(shù)據(jù)}
            for j:=1 to serversocket1.Socket.ActiveConnections do
               if serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle then
                  begin
                     serversocket1.Socket.Connections[j-1].SendBuf(rec_buffer,rec_bytes);  {發(fā)送數(shù)據(jù)}
                     break;
                  end;
            break;
         end;
end;

file://“頁面找不到”等錯誤信息出現(xiàn)時…
procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  inc(invalidrequests);
end;

file://查找遠(yuǎn)程主機定時…
procedure TForm1.Timer1Timer(Sender: TObject);
var
i,j: integer;
begin
   for i:=1 to sessions do
      if session[i-1].Used and session[i-1].Lookingup then    {假如正在連接}
         begin
            inc(session[i-1].LookupTime);
            if session[i-1].LookupTime>lookuptimeout then     {假如超時}
               begin
                  session[i-1].Lookingup:=false;
                  session[i-1].CSocket.active:=false;         {停止查找}
                  for j:=1 to serversocket1.Socket.ActiveConnections do
                     if serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle then
                        begin
                           serversocket1.Socket.Connections[j-1].Close;  {斷開客戶機}
                           break;
                        end;
               end;
         end;
end;
end.

3、 后記
由于這種設(shè)計思路僅僅在被代理端和遠(yuǎn)程主機之間增加了一個重定向功能,被代理端原
有的緩存技術(shù)等特點均保留,因此效率較高。經(jīng)過測試,利用1個33.6K的Modem上網(wǎng)時,三到十個被代理工作站同時上網(wǎng),仍有較好的響應(yīng)速度。由于被代理工作站和代理服務(wù)器工作站之間的連接一般通過高速鏈路,因此瓶頸主要出現(xiàn)在代理服務(wù)器的上網(wǎng)方式上。
通過上述方法,作者成功開發(fā)了一套完善的代理服務(wù)器軟件并與機房計費系統(tǒng)完全集
成,實現(xiàn)了利用一臺工作站完成上網(wǎng)代理、上網(wǎng)計費、用機計費等功能。 有編程經(jīng)驗的朋友完全可以另行增加代理服務(wù)器功能,如設(shè)定禁止訪問站點、統(tǒng)計客戶流量、Web訪問列表等等。


上一篇:Delphi命令行參數(shù)

下一篇:怎樣知道我的程序是否運行在DELPHI?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

亚洲а∨天堂久久精品2021| 成人av电影免费观看| 欧美精品与人动性物交免费看| 欧美精品国产精品久久久| 亚洲国产aⅴ精品一区二区| 伊人网站在线观看| 精品久久久久久无码国产| av在线资源观看| 日韩精品在线免费观看| 中文字幕一区二区在线播放| 国产曰批免费观看久久久| 九色蝌蚪国产| 久久网福利资源网站| 奇米四色…亚洲| 日韩毛片在线免费观看| 性感小视频在线看免费| 九九久久99| www国产成人| 欧美成人精品二区三区99精品| 在线人成日本视频| 女女色综合影院| 成人性生交大片| 国产精品九九久久久久久久| 久久亚洲成人精品| 日本美女爱爱视频| 国产在线2020| 亚洲午夜激情在线| 国产视频不卡| 亚洲一区二区影院| 在线观看亚洲精品福利片| 亚洲欧美久久婷婷爱综合一区天堂| 亚洲欧美日韩视频二区| 精品久久久久久亚洲精品| 牛牛影视一区二区三区免费看| 午夜免费一级片| 999在线观看精品免费不卡网站| 欧美伦理片在线观看| 亚洲国产精品国自产拍av| 国产女无套免费视频| 久久久亚洲综合| 激情亚洲综合在线| 国产欧美亚洲精品a| 色偷偷88欧美精品久久久| 九色在线观看视频| 六月丁香婷婷激情| 中文在线免费一区三区| 国产成人精品一区二区色戒| 久久久久久久久影视| 亚洲欧洲成人精品av97| 国产aⅴ激情无码久久久无码| 亚洲精品aaaa精品| www免费在线观看| 国产精品中文字幕欧美| 性生生活大片免费看视频| 日韩免费一区二区三区| 在线观看精品视频看看播放| 国产毛片在线| 国产免费内射又粗又爽密桃视频| 欧美成人手机在线视频| 性色av免费观看| 99久久精品久久久久久清纯| 三妻四妾的电影电视剧在线观看| 国精产品视频一二二区| 国产高清不卡视频| 中国av免费看| 欧美日韩国产一二三区| 做爰无遮挡三级| 草莓视频丝瓜在线观看丝瓜18| 亚洲成av人片一区二区| 欧美成人精品一区二区三区在线看| 影音先锋男人的网站| 亚洲一区二区| 久久婷婷影院| 国产一区二区三区中文字幕| 成年美女黄网站色大片不卡| 亚洲一区二区三区四区中文字幕| 欧美jizzhd欧美| 国产又爽又黄又刺激的软件| 成年人在线免费观看视频网站| 不卡av一区二区| 亚洲高清在线不卡| 亚洲激情图片小说视频| 美女精品导航| 国产成人麻豆免费观看| 精品少妇一区二区三区在线播放| 日韩久久精品成人| 另类的小说在线视频另类成人小视频在线| 国产福利电影网| 五月激情综合| 中文字幕在线不卡国产视频| 欧美日本三级| 91精品人妻一区二区三区蜜桃欧美| av在线网址导航| 久久午夜鲁丝片午夜精品| 妺妺窝人体色777777| www.com日本| 日韩欧美在线中字| 中文字幕乱码在线观看| 亚洲中文字幕无码av永久| 午夜精品影院| 精品999在线| 美腿丝袜亚洲三区| 五月天网站亚洲| 好吊色欧美一区二区三区四区| 欧美日韩激情在线观看| 欧洲精品码一区二区三区免费看| 久做在线视频免费观看| 亚洲综合色成人| 国产精品三区www17con| 欧洲黄色一级视频| a国产在线视频| 日韩影视高清在线观看| 国产情侣在线播放| 精品人伦一区二区三区蜜桃免费| 全网免费在线播放视频入口| 私密视频在线观看| 国产精品污视频| 美女被黑人爆操网站| 91久久香蕉国产日韩欧美9色| 黄色激情网站| 欧美午夜电影在线| 亚洲精品720p| 国产美女无遮挡永久免费| 在线www天堂网在线| 爱情岛论坛亚洲入口| 伊甸园精品99久久久久久| 国产成人a人亚洲精品无码| 精品伊人久久| 欧美亚洲国产激情| 国产精品99久久久久久久久| 成人免费视频网址| 男人的天堂影院| 国产在线观看不卡一区二区三区| 最新真实国产在线视频| 日本一区免费观看| 午夜精品福利一区二区三区蜜桃| 亚洲精品大片www| 午夜精品久久久久久久久| 99亚洲国产精品| 久久9999免费视频| 久久久91精品国产一区二区三区| 亚洲啊v在线| 久久久久高潮毛片免费全部播放| 国产精品欧美综合在线| 国产乱视频在线观看播放| 五月激情六月婷婷| 日韩av免费看| 久久这里只有| 欧美人与性动交a欧美精品| 久久综合久久综合久久| 亚洲一区二区三区色| 国产精品成人国产乱一区| 91精品啪在线观看麻豆免费| 成人免费视频网站| 日本激情综合网| 免费一区二区三区| 欧美三级乱人伦电影| 免费成人黄色大片| 摸摸摸bbb毛毛毛片| 91网站在线观看免费| 一级片在线视频| 日韩中文字幕国产精品| 欧美日韩免费观看一区二区三区| 国产精华一区二区三区| 国产精品色眯眯| 黄大色黄女片18免费| 欧美高清免费| 亚洲欧洲在线看| 99久久久精品免费观看国产| 国产精品亚洲片夜色在线| 97超碰人人看人人| 日韩特黄一级片| 亚洲色图在线看| 性欧美videos高清hd4k| 成人一区二区免费视频| 亚洲精品在线免费观看视频| 精品国产91亚洲一区二区三区婷婷| 在线观看精品自拍视频| 久久中文字幕免费| 国产日韩换脸av一区在线观看| 欧美高清视频在线播放| 亚洲AV无码成人精品一区| 菠萝蜜视频在线观看一区| 特级西西人体www高清大胆| 欧美视频在线看| 亚洲三区欧美一区国产二区| 亚洲乱熟女一区二区| 偷拍亚洲欧洲综合| 日韩欧美一区三区| 国产精品―色哟哟| 日本亚洲最大的色成网站www| 你懂的一区二区| 精品免费av| 日韩av中文字幕在线免费观看| 欧美精彩一区二区三区| 精品久久久无码中文字幕| 成人黄色免费视频| 青青操在线视频观看| 日本韩国精品在线| 91在线高清观看| 午夜精品123| 99免费看香蕉视频| 久久久精品麻豆| 成人性生交大片免费看在线播放| 久久精品综合一区| 久久免费国产精品1| 成年人视频在线网站| 一级片视频免费看| 亚洲精品久久久一区二区三区| 国产亚洲情侣一区二区无| 久久影视精品| 翁止熄痒禁伦短文合集免费视频| 日韩一区二区三区免费观看| 很黄很色的网站| 亚洲一区二区三区中文字幕| 精品肉辣文txt下载| 欧美日韩福利在线| 中文字幕中文在线不卡住| 日韩精品中文字幕在线观看| 欧美午夜精品一区二区三区| 日韩午夜精品电影| 在线看日韩精品电影| 色女孩综合网| 亚洲精品一区二| 一道本在线观看| 精品久久久久av影院| 亚洲国产乱码最新视频| 国产麻豆视频网站| 日韩电影在线看| 在线人成动漫视频在线观看| 亚洲人成777| 国产日韩亚洲精品| 在线观看欧美成人| 日本一区网站| 天堂а√在线最新版中文在线| 日韩免费高清av| 99精品视频免费版的特色功能| 92精品国产成人观看免费| 激情综合在线| 国产一区二区三区无遮挡| 91在线直播亚洲| 久久青青草原亚洲av无码麻豆| 久9久9色综合| 亚洲一区二区三区四区在线免费观看| 日本亚洲天堂网| 国产极品美女高潮无套嗷嗷叫酒店| 日韩色级片先锋影音| 欧美亚洲精品在线| 国产精品夜夜嗨| 国产精品久久久久久久久久久久午夜片| 在线永久看片免费的视频| av成人免费看| 成人在线免费看黄| 天堂在线中文在线| 久热精品在线观看| 91成人超碰| 肉丝美足丝袜一区二区三区四| 国产一伦一伦一伦| 亚洲第一色网| 自拍偷拍视频在线| av毛片在线| 久久综合毛片| аⅴ天堂中文在线网| 狠狠干成人综合网| 中文字幕日韩精品无码内射| wwwxxx在线观看| 69久久99精品久久久久婷婷| 有码在线播放| 国产精品aaaa| 久久国产这里只有精品| 日韩欧美不卡视频| 无遮挡的视频在线观看| 亚洲二区在线播放视频| 亚洲激情校园春色| 黄色一级视频免费看| 日本黄网站色大片免费观看| 久久久免费高清视频| 视频二区欧美毛片免费观看| 九色国产蝌蚪| 精品黄色免费中文电影在线播放| 蜜桃成人在线视频| 麻豆传媒在线免费| 色www亚洲国产阿娇yao| 日韩影院一区| 日韩国产欧美一区| 久久久精品欧美丰满| 精品亚洲永久免费| 欧美午夜精品一区二区三区电影| 91成人在线观看国产| 神马午夜在线观看| 超薄肉色丝袜脚交一区二区| 亚洲国产wwwccc36天堂| 99福利在线观看| 小日子的在线观看免费第8集| 欧美一区二区三区四区夜夜大片| 国产一级黄色大片| 美日韩丰满少妇在线观看| 欧美一区二区三区公司| 激情小说亚洲| 国产一区二区色噜噜| 亚洲国产99| 欧美自拍大量在线观看| 一区二区美女视频| 精品91福利视频| 国产成人免费视频网站视频社区| 一区二区国产日产| 99热久久这里只有精品| 欧美四级剧情无删版影片| 欧美日韩精品一区二区三区| 激情都市一区二区| 大胸美女被爆操| 在线免费一区| 中文字幕av一区 二区| 欧美激情中文字幕一区二区| 99草草国产熟女视频在线| 久久久久在线视频| 国内精品露脸在线视频播放| www.欧美日韩国产在线| 91精品欧美综合在线观看最新| 91精品国产一区二区人妖| 美女把尿口扒开给男人桶视频| 亚洲色图视频网| 日韩美女主播视频| 蜜桃视频在线观看一区二区| 国产精品久久久久不卡| 久久天天久久| 作爱视频免费观看视频在线播放激情网| 亚洲美女视频在线|