青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Windows系統(tǒng)編程之進(jìn)程間通信
北極星2003 當(dāng)前離線


Windows 的IPC(進(jìn)程間通信)機(jī)制主要是異步管道和命名管道。(至于其他的IPC方式,例如內(nèi)存映射、郵槽等這里就不介紹了)
管道(pipe)是用于進(jìn)程間通信的共享內(nèi)存區(qū)域。創(chuàng)建管道的進(jìn)程稱為管道服務(wù)器,而連接到這個(gè)管道的進(jìn)程稱為管道客戶端。一個(gè)進(jìn)程向管道寫入信息,而另外一個(gè)進(jìn)程從管道讀取信息。
異步管道是基于字符和半雙工的(即單向),一般用于程序輸入輸出的重定向;命名管道則強(qiáng)大地多,它們是面向消息和全雙工的,同時(shí)還允許網(wǎng)絡(luò)通信,用于創(chuàng)建客戶端/服務(wù)器系統(tǒng)。
一、異步管道(實(shí)現(xiàn)比較簡單,直接通過實(shí)例來講解)
實(shí)驗(yàn)?zāi)繕?biāo):當(dāng)前有sample.cpp, sample.exe, sample.in這三個(gè)文件,sample.exe為sample.cpp的執(zhí)行程序,sample.cpp只是一個(gè)簡單的程序示例(簡單求和),如下:
代碼:
#include <iostream.h>
int main()
{
  int a, b ;
  while ( cin >> a >> b && ( a || b ) )
    cout << a + b << endl ;
  return 0;
}
Sample.in文件是輸入文件,內(nèi)容:
32 433
542 657
0 0
要求根據(jù)sample.exe和它的輸入數(shù)據(jù),把輸出數(shù)據(jù)重定向到sample.out
流程分析:實(shí)際這個(gè)實(shí)驗(yàn)中包含兩個(gè)部分,把輸入數(shù)據(jù)重定向到sample.exe 和把輸出數(shù)據(jù)重定向到sample.out。在命令行下可以很簡單的實(shí)現(xiàn)這個(gè)功能“sample <sample.in >sample.out”,這個(gè)命令也是利用管道特性實(shí)現(xiàn)的,現(xiàn)在我們就根據(jù)異步管道的實(shí)現(xiàn)原理自己來實(shí)現(xiàn)這個(gè)功能。
管道是基于半雙工(單向)的,這里有兩個(gè)重定向的過程,顯然需要?jiǎng)?chuàng)建兩個(gè)管道,下面給出流程圖:
 
異步管道實(shí)現(xiàn)的流程圖說明:
1)。父進(jìn)程是我們需要實(shí)現(xiàn)的,其中需要?jiǎng)?chuàng)建管道A,管道B,和子進(jìn)程,整個(gè)實(shí)現(xiàn)流程分為4個(gè)操作。
2)。管道A:輸入管道
3)。管道B:輸出管道
4)。操作A:把輸入文件sample.in的數(shù)據(jù)寫入輸入管道(管道A)
5)。操作B:子進(jìn)程從輸入管道中讀取數(shù)據(jù),作為該進(jìn)程的加工原料。通常,程序的輸入數(shù)據(jù)由標(biāo)準(zhǔn)的輸入設(shè)備輸入,這里實(shí)現(xiàn)輸入重定向,即把輸入管道作為輸入設(shè)備。
6)。操作C:子進(jìn)程把加工后的成品(輸出數(shù)據(jù))輸出到輸出管道。通常,程序的輸出數(shù)據(jù)會(huì)輸出到標(biāo)準(zhǔn)的輸出設(shè)備,一般為屏幕,這里實(shí)現(xiàn)輸出重定向,即把輸出管道作為輸出設(shè)備。
7)。操作D:把輸出管道的數(shù)據(jù)寫入輸出文件
需要注意的是,管道的本質(zhì)只是一個(gè)共享的內(nèi)存區(qū)域。這個(gè)實(shí)驗(yàn)中,管道區(qū)域處于父進(jìn)程的地址空間中,父進(jìn)程的作用是提供環(huán)境和資源,并協(xié)調(diào)子進(jìn)程進(jìn)行加工。
程序源碼:
代碼:
#include <windows.h> 
#include <iostream.h>
const int BUFSIZE = 4096 ; 
HANDLE  hChildStdinRd, hChildStdinWr, hChildStdinWrDup, 
       hChildStdoutRd,hChildStdoutWr,hChildStdoutRdDup, 
    hSaveStdin,    hSaveStdout; 
BOOL CreateChildProcess(LPTSTR); 
VOID WriteToPipe(LPTSTR); 
VOID ReadFromPipe(LPTSTR); 
VOID ErrorExit(LPTSTR); 
VOID ErrMsg(LPTSTR, BOOL); 
void main( int argc, char *argv[] ) 
{  
  // 處理輸入?yún)?shù)
  if ( argc != 4 )
    return ;
  // 分別用來保存命令行,輸入文件名(CPP/C),輸出文件名(保存編譯信息)
  LPTSTR lpProgram = new char[ strlen(argv[1]) ] ;
  strcpy ( lpProgram, argv[1] ) ;
  LPTSTR lpInputFile = new char[ strlen(argv[2]) ];
  strcpy ( lpInputFile, argv[2] ) ;
  LPTSTR lpOutputFile = new char[ strlen(argv[3]) ] ;
  strcpy ( lpOutputFile, argv[3] ) ;    
  
  SECURITY_ATTRIBUTES saAttr; 
  saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
  saAttr.bInheritHandle = TRUE; 
  saAttr.lpSecurityDescriptor = NULL; 
   
  /************************************************
   *    redirecting child process's STDOUT  *
   ************************************************/
  hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
  
  if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) 
    ErrorExit("Stdout pipe creation failed\n"); 
    
  if (! SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr)) 
    ErrorExit("Redirecting STDOUT failed"); 
  
  BOOL fSuccess = DuplicateHandle(
    GetCurrentProcess(), 
    hChildStdoutRd,
        GetCurrentProcess(), 
    &hChildStdoutRdDup ,
    0,
        FALSE,
        DUPLICATE_SAME_ACCESS);
    if( !fSuccess )
        ErrorExit("DuplicateHandle failed");
    CloseHandle(hChildStdoutRd);
  
  /************************************************
   *    redirecting child process's STDIN    *
   ************************************************/
  hSaveStdin = GetStdHandle(STD_INPUT_HANDLE); 
  if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) 
    ErrorExit("Stdin pipe creation failed\n"); 
  
  if (! SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd)) 
    ErrorExit("Redirecting Stdin failed"); 
  
  fSuccess = DuplicateHandle(
    GetCurrentProcess(), 
    hChildStdinWr, 
    GetCurrentProcess(),
    &hChildStdinWrDup, 
    0, 
    FALSE,                 
    DUPLICATE_SAME_ACCESS); 
  if (! fSuccess) 
    ErrorExit("DuplicateHandle failed"); 
  CloseHandle(hChildStdinWr);   
  /************************************************
   *      創(chuàng)建子進(jìn)程(即啟動(dòng)SAMPLE.EXE)    *
   ************************************************/
  fSuccess = CreateChildProcess( lpProgram );
  if ( !fSuccess ) 
    ErrorExit("Create process failed"); 
  
  // 父進(jìn)程輸入輸出流的還原設(shè)置
  if (! SetStdHandle(STD_INPUT_HANDLE, hSaveStdin)) 
    ErrorExit("Re-redirecting Stdin failed\n"); 
  if (! SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout)) 
    ErrorExit("Re-redirecting Stdout failed\n"); 
  WriteToPipe( lpInputFile ) ;
  ReadFromPipe( lpOutputFile ); 
          delete lpProgram ;
          delete lpInputFile ;
          delete lpOutputFile ;
} 
BOOL CreateChildProcess( LPTSTR lpProgram ) 
{ 
  PROCESS_INFORMATION piProcInfo; 
  STARTUPINFO siStartInfo;
  BOOL bFuncRetn = FALSE; 
  
  ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
  ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
  siStartInfo.cb = sizeof(STARTUPINFO); 
  
  bFuncRetn = CreateProcess ( NULL, lpProgram, NULL, NULL, TRUE, \
                0, NULL, NULL, &siStartInfo, &piProcInfo);
  if (bFuncRetn == 0) 
  {
    ErrorExit("CreateProcess failed\n");
    return 0;
  } 
  else 
  {
    CloseHandle(piProcInfo.hProcess);
    CloseHandle(piProcInfo.hThread);
    return bFuncRetn;
  }
}
VOID WriteToPipe( LPTSTR lpInputFile ) 
{ 
  HANDLE hInputFile = CreateFile(lpInputFile, GENERIC_READ, 0, NULL, 
    OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); 
  if (hInputFile == INVALID_HANDLE_VALUE) 
    return ;
  BOOL fSuccess ;
  DWORD dwRead, dwWritten; 
  CHAR chBuf[BUFSIZE] = {0} ; 
  
  for (;;) 
  { 
    fSuccess = ReadFile( hInputFile, chBuf, BUFSIZE, &dwRead, NULL) ;
    if ( !fSuccess || dwRead == 0)
      break; 
    fSuccess = WriteFile( hChildStdinWrDup, chBuf, dwRead, &dwWritten, NULL) ;
    if ( !fSuccess ) 
      break; 
  } 
    
  if (! CloseHandle(hChildStdinWrDup)) 
    ErrorExit("Close pipe failed\n"); 
  CloseHandle ( hInputFile ) ;
} 
VOID ReadFromPipe( LPTSTR lpOutputFile ) 
{ 
  HANDLE hOutputFile = CreateFile( lpOutputFile, GENERIC_READ|GENERIC_WRITE, 
    FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
  if (hOutputFile == INVALID_HANDLE_VALUE) 
    return ;
  BOOL fSuccess ;
  DWORD dwRead, dwWritten; 
  CHAR chBuf[BUFSIZE] = { 0 }; 
  
  if (!CloseHandle(hChildStdoutWr)) 
    ErrorExit("Closing handle failed"); 
  
  for (;;) 
  { 
    fSuccess = ReadFile( hChildStdoutRdDup, chBuf, BUFSIZE, &dwRead, NULL) ;
    if( !fSuccess || dwRead == 0) 
    {
      break; 
    }
    fSuccess = WriteFile( hOutputFile, chBuf, dwRead, &dwWritten, NULL) ;
    if ( !fSuccess ) 
      break; 
  } 
  CloseHandle ( hOutputFile ) ;
} 
VOID ErrorExit (LPTSTR lpszMessage) 
{ 
  MessageBox( 0, lpszMessage, 0, 0 ); 
}
二、命名管道
命名管道具有以下幾個(gè)特征:
(1)命名管道是雙向的,所以兩個(gè)進(jìn)程可以通過同一管道進(jìn)行交互。
(2)命名管道不但可以面向字節(jié)流,還可以面向消息,所以讀取進(jìn)程可以讀取寫進(jìn)程發(fā)送的不同長度的消息。
(3)多個(gè)獨(dú)立的管道實(shí)例可以用一個(gè)名稱來命名。例如幾個(gè)客戶端可以使用名稱相同的管道與同一個(gè)服務(wù)器進(jìn)行并發(fā)通信。
(4)命名管道可以用于網(wǎng)絡(luò)間兩個(gè)進(jìn)程的通信,而其實(shí)現(xiàn)的過程與本地進(jìn)程通信完全一致。
實(shí)驗(yàn)?zāi)繕?biāo):在客戶端輸入數(shù)據(jù)a和b,然后發(fā)送到服務(wù)器并計(jì)算a+b,然后把計(jì)算結(jié)果發(fā)送到客戶端??梢远鄠€(gè)客戶端與同一個(gè)服務(wù)器并行通信。
界面設(shè)計(jì):
 http://bbs.pediy.com/upload/2006/41/image/namedpipe.gif 
難點(diǎn)所在:
實(shí)現(xiàn)的過程比較簡單,但有一個(gè)難點(diǎn)。原本當(dāng)服務(wù)端使用ConnectNamedPipe函數(shù)后,如果有客戶端連接,就可以直接進(jìn)行交互。原來我在實(shí)現(xiàn)過程中,當(dāng)管道空閑時(shí),管道的線程函數(shù)會(huì)無限(INFINITE)阻塞。若現(xiàn)在需要停止服務(wù),就必須結(jié)束所有的線程,TernimateThread可以作為一個(gè)結(jié)束線程的方法,但我基本不用這個(gè)函數(shù)。一旦使用這個(gè)函數(shù)之后,目標(biāo)線程就會(huì)立即結(jié)束,但如果此時(shí)的目標(biāo)線程正在操作互斥資源、內(nèi)核調(diào)用、或者是操作共享DLL的全局變量,可能會(huì)出現(xiàn)互斥資源無法釋放、內(nèi)核異常等現(xiàn)象。這里我用重疊I/0來解決這個(gè)問題,在創(chuàng)建PIPE時(shí)使用FILE_FLAG_OVERLAPPED標(biāo)志,這樣使用ConnectNamedPipe后會(huì)立即返回,但線程的阻塞由等待函數(shù)WaitForSingleObject來實(shí)現(xiàn),等待OVERLAPPED結(jié)構(gòu)的事件對象被設(shè)置。
客戶端主要代碼:
代碼:
void CMyDlg::OnSubmit() 
{
  // 打開管道
  HANDLE hPipe = CreateFile("\\\\.\\Pipe\\NamedPipe", GENERIC_READ | GENERIC_WRITE, \
    0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ;
  if ( hPipe == INVALID_HANDLE_VALUE )
  {
    this->MessageBox ( "打開管道失敗,服務(wù)器尚未啟動(dòng),或者客戶端數(shù)量過多" ) ;
    return ;
  }
  DWORD nReadByte, nWriteByte ;
  char szBuf[1024] = {0} ;
  // 把兩個(gè)整數(shù)(a,b)格式化為字符串
  sprintf ( szBuf, "%d %d", this->nFirst, this->nSecond ) ;
  // 把數(shù)據(jù)寫入管道
  WriteFile ( hPipe, szBuf, strlen(szBuf), &nWriteByte, NULL ) ;
  memset ( szBuf, 0, sizeof(szBuf) ) ;
  // 讀取服務(wù)器的反饋信息
  ReadFile ( hPipe, szBuf, 1024, &nReadByte, NULL ) ;
  // 把返回信息格式化為整數(shù)
  sscanf ( szBuf, "%d", &(this->nResValue) ) ;
  this->UpdateData ( false ) ;
  CloseHandle ( hPipe ) ;
}
服務(wù)端主要代碼:
代碼:
// 啟動(dòng)服務(wù)
void CMyDlg::OnStart() 
{
  CString lpPipeName = "\\\\.\\Pipe\\NamedPipe" ;
  for ( UINT i = 0; i < nMaxConn; i++ )
  {
    // 創(chuàng)建管道實(shí)例
    PipeInst[i].hPipe =  CreateNamedPipe ( lpPipeName, PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED, \
          PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_WAIT, nMaxConn, 0, 0, 1000, NULL ) ;
    if ( PipeInst[i].hPipe == INVALID_HANDLE_VALUE )
    {
      DWORD dwErrorCode = GetLastError () ;
      this->MessageBox ( "創(chuàng)建管道錯(cuò)誤!" ) ;
      return ;
    }
    // 為每個(gè)管道實(shí)例創(chuàng)建一個(gè)事件對象,用于實(shí)現(xiàn)重疊IO
    PipeInst[i].hEvent  =  CreateEvent ( NULL, false, false, false ) ;
    // 為每個(gè)管道實(shí)例分配一個(gè)線程,用于響應(yīng)客戶端的請求
    PipeInst[i].hTread = AfxBeginThread ( ServerThread, &PipeInst[i], THREAD_PRIORITY_NORMAL ) ;
  }
  
  this->SetWindowText ( "命名管道實(shí)例之服務(wù)器(運(yùn)行)" ) ;
  this->MessageBox ( "服務(wù)啟動(dòng)成功" ) ;
}
// 停止服務(wù)
void CMyDlg::OnStop() 
{
  DWORD dwNewMode = PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_NOWAIT ;
  for ( UINT i = 0; i < nMaxConn; i++ )
  {
    SetEvent ( PipeInst[i].hEvent ) ;
    CloseHandle ( PipeInst[i].hTread ) ;
    CloseHandle ( PipeInst[i].hPipe ) ;
  }
    
  this->SetWindowText ( "命名管道實(shí)例之服務(wù)器" ) ;
  this->MessageBox ( "停止啟動(dòng)成功" ) ;
}
// 線程服務(wù)函數(shù)
UINT ServerThread ( LPVOID lpParameter )
{
  DWORD  nReadByte = 0, nWriteByte = 0, dwByte = 0 ;  
  char  szBuf[MAX_BUFFER_SIZE] = {0} ;
  PIPE_INSTRUCT  CurPipeInst = *(PIPE_INSTRUCT*)lpParameter ;
  OVERLAPPED OverLapStruct = { 0, 0, 0, 0, CurPipeInst.hEvent } ;
  while ( true )
  {
    memset ( szBuf, 0, sizeof(szBuf) ) ;  
    // 命名管道的連接函數(shù),等待客戶端的連接(只針對NT)
    ConnectNamedPipe ( CurPipeInst.hPipe, &OverLapStruct ) ;
    // 實(shí)現(xiàn)重疊I/0,等待OVERLAPPED結(jié)構(gòu)的事件對象
    WaitForSingleObject ( CurPipeInst.hEvent, INFINITE ) ;
    // 檢測I/0是否已經(jīng)完成,如果未完成,意味著該事件對象是人工設(shè)置,即服務(wù)需要停止
    if ( !GetOverlappedResult ( CurPipeInst.hPipe, &OverLapStruct, &dwByte, true ) )
      break ;
    // 從管道中讀取客戶端的請求信息
    if ( !ReadFile ( CurPipeInst.hPipe, szBuf, MAX_BUFFER_SIZE, &nReadByte, NULL ) )
    {
      MessageBox ( 0, "讀取管道錯(cuò)誤!", 0, 0 ) ;
      break ;
    }
    
    int a, b ;
    sscanf ( szBuf, "%d %d", &a, &b ) ;
    pMyDlg->nFirst    = a ;
    pMyDlg->nSecond    = b ;
    pMyDlg->nResValue  = a + b ;
    memset ( szBuf, 0, sizeof(szBuf) ) ;
    sprintf ( szBuf, "%d", pMyDlg->nResValue ) ;
    // 把反饋信息寫入管道
    WriteFile ( CurPipeInst.hPipe, szBuf, strlen(szBuf), &nWriteByte, NULL ) ;
    pMyDlg->SetDlgItemInt ( IDC_FIRST, a, true ) ;
    pMyDlg->SetDlgItemInt ( IDC_SECOND, b, true ) ;
    pMyDlg->SetDlgItemInt ( IDC_RESULT, pMyDlg->nResValue, true ) ;
    // 斷開客戶端的連接,以便等待下一客戶的到來
    DisconnectNamedPipe ( CurPipeInst.hPipe ) ;
  }
  return 0 ;
}
Posted on 2011-02-15 12:30 鄭興鋒 閱讀(812) 評(píng)論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合伊人77777麻豆| 欧美日韩午夜剧场| 久久九九有精品国产23| 午夜精彩视频在线观看不卡| 一本到高清视频免费精品| 亚洲黄网站黄| 亚洲国产精品999| 亚洲福利国产精品| 亚洲精品免费电影| 亚洲一二三级电影| 欧美亚洲免费电影| 麻豆精品一区二区综合av| 欧美成人亚洲| 一本久久综合亚洲鲁鲁| 午夜精品视频在线| 免费91麻豆精品国产自产在线观看| 久久综合中文| 欧美日韩一区二区欧美激情| 国产免费观看久久| 欧美高清视频在线观看| 亚洲精品国产视频| 一区二区三区欧美日韩| 欧美一级视频精品观看| 欧美aⅴ一区二区三区视频| 亚洲欧洲精品成人久久奇米网| 欧美粗暴jizz性欧美20| 亚洲少妇最新在线视频| 久久精品91| 欧美日韩国产一区| 伊人久久男人天堂| avtt综合网| 蜜桃av一区二区| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 精品成人国产在线观看男人呻吟| 亚洲激情另类| 久久高清一区| 亚洲精品一区在线观看香蕉| 欧美在线免费视频| 国产精品高精视频免费| 亚洲精品色图| 嫩模写真一区二区三区三州| 亚洲欧美国内爽妇网| 欧美另类在线播放| 亚洲人成网站色ww在线| 久久综合影视| 欧美影院一区| 国产视频欧美视频| 午夜精品久久久久久久白皮肤| 亚洲国产精品久久| 久久久久一区| 黄色日韩在线| 久久久综合免费视频| 亚洲尤物影院| 欧美视频一区二区三区| 在线亚洲精品| 亚洲人成网站777色婷婷| 欧美1区3d| 亚洲欧洲精品成人久久奇米网| 久久综合国产精品| 欧美亚洲尤物久久| 国产综合婷婷| 久久在线免费观看| 久久蜜桃精品| 亚洲国产一成人久久精品| 免费观看亚洲视频大全| 欧美影院久久久| 国内精品视频在线观看| 久久久久一本一区二区青青蜜月| 性做久久久久久久免费看| 国产精品午夜久久| 久久久精品视频成人| 欧美在线免费视频| 国产亚洲欧洲一区高清在线观看| 久久九九热免费视频| 老司机精品福利视频| 欧美 日韩 国产一区二区在线视频| 欧美大片免费久久精品三p| 亚洲在线视频一区| 国产综合色产| 最新亚洲电影| 国产精品理论片| 久久久久高清| 免费欧美在线| 亚洲视频在线播放| 亚洲在线视频| 亚洲欧洲日本在线| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美伊久线香蕉线新在线| 国产专区欧美精品| 亚洲电影有码| 国产精品免费在线| 麻豆精品一区二区av白丝在线| 欧美激情精品久久久久久黑人| 亚洲综合精品| 久久精品国产一区二区电影| 亚洲国产精品va在看黑人| 日韩亚洲国产精品| 激情一区二区三区| 在线视频欧美精品| 亚洲二区免费| 亚洲欧美精品中文字幕在线| 亚洲国产精品成人综合| 亚洲一区二区三区四区五区午夜| 一区二区在线免费观看| 一本大道久久a久久精品综合| 极品尤物av久久免费看| 亚洲色图自拍| 一级日韩一区在线观看| 久久久久综合网| 欧美呦呦网站| 欧美色综合网| 亚洲国产高清aⅴ视频| 国内一区二区在线视频观看| 亚洲无吗在线| 亚洲色图自拍| 榴莲视频成人在线观看| 欧美专区在线观看一区| 欧美偷拍另类| 亚洲精品日韩激情在线电影| 亚洲第一天堂av| 久久成人精品视频| 欧美在线视频观看免费网站| 欧美三区在线| 日韩特黄影片| 亚洲精品你懂的| 久久只精品国产| 狂野欧美激情性xxxx欧美| 国产香蕉久久精品综合网| 亚洲一区二区毛片| 99国产精品久久久| 欧美~级网站不卡| 另类激情亚洲| 在线观看一区视频| 久久香蕉国产线看观看av| 久久亚洲综合色| 国产日韩精品久久久| 亚洲欧美日韩国产综合精品二区| 亚洲成人在线网站| 亚洲一级二级| 欧美xxxx在线观看| 欧美激情91| 亚洲精选久久| 欧美区二区三区| 日韩亚洲欧美中文三级| 亚洲午夜一二三区视频| 欧美日韩性视频在线| 亚洲视频在线一区| 欧美在线电影| 狠狠色2019综合网| 每日更新成人在线视频| 亚洲高清不卡av| 亚洲美女精品成人在线视频| 欧美久色视频| 制服丝袜激情欧洲亚洲| 亚洲欧美日韩精品综合在线观看| 欧美日韩亚洲高清一区二区| 一区二区三区黄色| 亚洲永久在线| 国产亚洲精品久| 久久日韩精品| 亚洲欧洲日本一区二区三区| 中文精品一区二区三区| 国产欧美精品一区二区三区介绍| 欧美在线免费播放| 欧美激情视频网站| 宅男精品导航| 国产综合欧美在线看| 日韩亚洲在线观看| 久久精品国产91精品亚洲| 美女日韩在线中文字幕| 99视频超级精品| 国产精品美腿一区在线看| 久久精品中文字幕免费mv| 欧美成人免费网| 亚洲在线播放| 国产欧美日韩在线视频| 狂野欧美激情性xxxx| 亚洲网站视频福利| 亚洲福利免费| 久久久91精品国产一区二区三区 | 麻豆精品视频在线观看| aⅴ色国产欧美| 国产一区二区黄色| 欧美日韩免费视频| 久久久久久久网| 亚洲一区二区三区免费观看| 亚洲国产精品久久久久秋霞不卡| 亚洲欧美日韩一区| 亚洲风情亚aⅴ在线发布| 国产精品国产三级国产普通话蜜臀| 久久久久国内| 午夜亚洲性色福利视频| 99国产精品久久| 欧美+日本+国产+在线a∨观看| 亚洲一区二区三区高清| 亚洲人体一区| 在线观看视频亚洲| 国产日韩欧美制服另类| 欧美日韩国产首页在线观看| 欧美国产91|