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

隨筆 - 224  文章 - 41  trackbacks - 0
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

享受編程

常用鏈接

留言簿(11)

隨筆分類(159)

隨筆檔案(224)

文章分類(2)

文章檔案(4)

經典c++博客

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

原文地址:http://blog.csdn.net/li_guotao/archive/2009/03/04/3956067.aspx
一 WinINet是干什么的?
二 如果完成一個基本的WinINet操作流程
三 如何異步完成,異步操作的好處。
四 unicode以及mutilbyte
五 代碼樣例

一 WinINet是微軟開發的一個庫,可以完成http ftp客戶端的工作。讓程序員從復雜的協議中節省大量體力。

二 我會用了http, ftp類似。用WinINet完成一個http下載需要以下步驟 。 下面這個是同步操作(也就是一步步操作,每個函數執行完才會返回一個結果的意思)

     1   InternetOpen      Initializes an application's use of the WinINet functions.
                   需要的話 InternetSetOption 設置代理服務器地址以及端口。
                   http:    ip:port 或者 http=http://ip:port
                   socks:SOCKS=ip:port
     2   InternetConnect    關聯目標地址或者域名以及服務ip

     3   HttpOpenRequest   關聯要下載的內容名字
                   InternetSetOption 設置用戶名密碼

     4   HttpSendRequest     這步就是用HttpOpenRequest 的返回值(已經關聯了上面的所有信息)發送出去,第一次用了網絡。向目標服務器或者代理服務器。

     5   HttpQueryInfo
            該函數查詢返回值,不參與網絡操作。可以查詢服務器的返回信息,比如目標文件的大小,該文件是否存在,代理服務返回了要求用戶名,密碼等等(這幾個最常用),還有很多信息。

     6   InternetReadFile
            很普通的讀函數,就是下載文件。不知道是否和底層網絡同步,底層會不會提前下載呢?

     7   InternetCloseHandle 釋放資源

三    異步操作,比較復雜的。   為什么需要異步操作呢? 因為涉及到網絡操作,某些函數在操作中可能需要時間,如果一直不返回(比如1秒)時,這時主線程要結束程序,豈不就出現意想不到的結果了,但是如果每個函數都能夠瞬間返回,然后通過WaitForMultipleObjects或者WaitForSingleObject等待結果的出現(此時就不會操作那個消耗1秒的函數了,而這個1秒函數正是要用到系統資源HINTERNET的)。

       異步操作的目的上如,原理呢? 其實原理就是注冊一個函數,在這里叫InternetStatusCallback,因為微軟寫得底層代碼要用到,所以必須格式統一。一旦有結果來了就通過事件通知我們,WaitForSingleObject函數就可以走了。比如等到了HINTERNET創建或者命令發送成功等結果。然后我們就可以第一時間安全的使用了。
      API 函數如果名字最后可以帶EX,那么帶ex的就是異步操作的。

四 一定要注意,凡是有unicode和mutilbyte函數的一定要統一,最好都用mutilbyte的。


五: 代碼如下:
// crt_assert.c
// compile with: /c
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>


#include <iostream>

#include "winsock2.h"
#include <string>
#include <Wininet.h>
#include <windows.h>
#include <fstream> //要使用文件輸入輸出流必須的頭文件
using namespace std;
#define __HTTP_VERB_GET    "GET"
#define __HTTP_VERB_POST "POST"
#define __HTTP_ACCEPT_TYPE "*/*"
#define __HTTP_ACCEPT "Accept: */*\r\n"
#define __SIZE_HTTP_BUFFER    100000
#define __SIZE_HTTP_RESPONSE_BUFFER    100000
#define __SIZE_HTTP_HEAD_LINE    2048

void CALLBACK InternetStatusCallback(

                                    HINTERNET hInternet,
                                    DWORD dwContext,
                                    DWORD dwInternetStatus,
                                    LPVOID lpvStatusInformation,
                                    DWORD dwStatusInformationLength);
HANDLE hEvent[3];

HINTERNET hFile;
HINTERNET hNet;
HINTERNET hSession,hConnect,hRequest;
int WaitExitEvent()
{
    //return 1;
    DWORD dwRet = ::WaitForMultipleObjects(3, hEvent, FALSE, 30000);//INFINITE);
    int x=-1;
    switch (dwRet)
    {
        //句柄被創建事件或者讀數據請求成功完成事件
    case WAIT_OBJECT_0:
        x=0;
        cout<<"WAIT_OBJECT_0"<<endl;
        //句柄被關閉事件
        break;
    case WAIT_OBJECT_0+1:
        x=1;
        cout<<"WAIT_OBJECT_1"<<endl;
        //用戶要求終止子線程事件或者發生錯誤事件
        break;
    case WAIT_OBJECT_0+2:
        x=2;
        cout<<"WAIT_OBJECT_2"<<endl;
       
        break;
    default:
        cout<<"WaitForMultipleObjects time out"<<endl;
        return -1;

    }
    return x;
}

// 支持代理設置, 是否異步設置; 采用事件驅動
void WinINet3(bool setProxy, bool ASYNC)
{
    hSession=NULL;
    hConnect=NULL;
    hRequest=NULL;
    for (int i = 0; i < 3; i++)
    {
        hEvent[i] = CreateEvent(
            NULL,   // default security attributes
            FALSE, // auto-reset event object
            FALSE, // initial state is nonsignaled
            NULL); // unnamed object

        if (hEvent[i] == NULL)
        {
            printf("CreateEvent error: %d\n", GetLastError() );
            ExitProcess(0);
        }
    }
    char *url = "    char *pip = "down.360safe.com";
    char *paim = "/setup.exe";

 

    //   step 1
    if(ASYNC)    cout<<"異步模式"<<endl;
   // setProxy =false;
    if(setProxy)
    {
        cout<<"代理模式"<<endl;
        if(ASYNC)
          hSession = InternetOpen("name",
        INTERNET_OPEN_TYPE_DIRECT,//|INTERNET_OPEN_TYPE_PROXY,// INTERNET_OPEN_TYPE_PROXY,
        NULL,NULL,INTERNET_FLAG_ASYNC); // 異步
        else
          hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PROXY,NULL,NULL,0); // 同步
    }
    else
    {
        if(ASYNC)
            hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_ASYNC); // 異步
        else
            hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); // 同步
    }
    if(!hSession){
        DWORD er = ::GetLastError();
        cout<<"InternetOpen error"<<endl;//, "Err", MB_OK);
        return;
    }
    if(ASYNC)
    {
        //Sleep(500);
        INTERNET_STATUS_CALLBACK res = ::InternetSetStatusCallback(hSession,InternetStatusCallback);
        if(res == INTERNET_INVALID_STATUS_CALLBACK)
        {
            cout<<"InternetSetStatusCallback failed, so return "<<endl;
            return ;   
        }
        else
        {
            cout<<"InternetSetStatusCallback succeed, so go on "<<endl;

        }
        //Sleep(500);
    }
   
    char   strProxyList[MAX_PATH],   strUsername[64],   strPassword[64];
    strcpy(strProxyList,   "SOCKS=58.56.87.2:1080"); //   寫上socks怎么就無效了呢???SOCKS5=172.18.132.27:1080
    strcpy(strUsername,   "user01");
    strcpy(strPassword,   "baidu");
    INTERNET_PROXY_INFO proxy;
    proxy.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    proxy.lpszProxy    = strProxyList;
    proxy.lpszProxyBypass = NULL;
    if( setProxy &&!InternetSetOption(hSession,INTERNET_OPTION_PROXY ,&proxy,sizeof(INTERNET_PROXY_INFO)))
    {
        cout<<"InternetSetOption failed"<<endl;
        return ;
    }
   
    // step 2
    //如果明確知道需要認證,第4,5個參數可以輸入用戶名,密碼"administrator","password"
    //第2,3個參數為目標主機IP、端口號(不是代理服務器的參數)
    hConnect = InternetConnect(hSession,pip,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,INTERNET_FLAG_RELOAD,0);
    if(!ASYNC &&!hConnect){
        cout<<"同步,InternetConnect error"<<endl;//, "Err", MB_OK);
        return;
    }
    if( ASYNC&& hConnect== NULL)// 異步 需要等待   竟然直接創建好了
    {
        int er = GetLastError();
        DWORD dwError = ::GetLastError();
        if (dwError != ERROR_IO_PENDING)
        {
            cout<<"CHttpDownload::OpenInternetConnection| 連接失敗" <<endl;
            return ;
        }
        else //
        {
            cout<<"hConnect == NULL, so run WaitExitEvent"<<endl;
            WaitExitEvent(); // 等待成功創建 // 這里應該等待   這里應該顯示一次呀
            ::ResetEvent(hEvent[0]);
            ::ResetEvent(hEvent[1]);
            ::ResetEvent(hEvent[2]);
        }
    }
    cout<<"step 2 :InternetConnect secced"<<endl;

    // ::InternetSetStatusCallback(hConnect,InternetStatusCallback);
   
    // step 3!!!
    char   szHead[] = "Accept: */*\r\n\r\n";
    char **p = new char*[2];*p = szHead;*(p+1) = NULL;

    //hRequest = HttpOpenRequest(hConnect,"GET","download/BaiduHi_1.0_Beta2.exe",NULL,NULL,/*(const char **)p*/NULL,0/*INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_RELOAD*/,0); // no request;
    CONST TCHAR *szAcceptType=__HTTP_ACCEPT_TYPE;
    hRequest = ::HttpOpenRequest(hConnect,
        "GET",
        paim,
        HTTP_VERSION,
        "",
        &szAcceptType,
        INTERNET_FLAG_RELOAD|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_NO_CACHE_WRITE,
        0);
   
    //::HttpAddRequestHeaders( hRequest, __HTTP_ACCEPT, strlen(__HTTP_ACCEPT), HTTP_ADDREQ_FLAG_REPLACE);
    /*_hHTTPRequest=::HttpOpenRequest(    _hHTTPConnection,
        __HTTP_VERB_GET, // HTTP Verb
        szURI, // Object Name
        HTTP_VERSION, // Version
        "", // Reference
        &szAcceptType, // Accept Type
        INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
        0); // context call-back point
    */
    if (!ASYNC&& !hRequest){
        cout<<"同步,HttpOpenRequest error"<<endl;//, "Err", MB_OK);
        return;
    }
    if( ASYNC&& hRequest== NULL)// 異步 需要等待
    {
        int er = GetLastError();
        DWORD dwError = ::GetLastError();
        if (dwError != ERROR_IO_PENDING)
        {
            cout<<"CHttpDownload::OpenInternetConnection| 連接失敗" <<endl;
            return ;
        }
        else //
        {
            cout<<"hRequest == NULL, so run WaitExitEvent"<<endl;
            WaitExitEvent(); // 等待成功創建
            ::ResetEvent(hEvent[0]);
            ::ResetEvent(hEvent[1]);
            ::ResetEvent(hEvent[2]);
        }
    }
    //Sleep(10000);
    cout << "step 3 : HttpOpenRequest success"<<endl;
    //::InternetSetStatusCallback(hRequest,InternetStatusCallback);
    //////////////////////////////////////////////
    if (setProxy )
    {
        // InternetSetOption 不要異步等待
        if( !InternetSetOption(hRequest,INTERNET_OPTION_PROXY_USERNAME ,strUsername,strlen(strUsername)+1))
        {
            cout<<"InternetSetOption Username failed"<<endl;
            return ;
        }
        if( !InternetSetOption(hRequest,INTERNET_OPTION_PROXY_PASSWORD ,strPassword,strlen(strPassword)+1))
        {
            cout<<"InternetSetOption Password failed"<<endl;
            return ;
        }
    }
    // step 4
    //HttpSendRequest(hRequest,NULL,0,NULL,0);
    //Sleep(3000);
    ::ResetEvent(hEvent[0]);
    ::ResetEvent(hEvent[1]);
    ::ResetEvent(hEvent[2]);
    if(!::HttpSendRequest(hRequest,NULL,0,NULL,0)) // 為什么失敗???
    {
        //Sleep(3000);
        if(!ASYNC)// 同步
        {
            DWORD dwError = ::GetLastError();
              cout<<"同步,HttpSendRequest failed, GetLastError=="<<dwError<<endl;
            return ;
       
        }
        else
        {
            Sleep(3000);
            DWORD dwError = ::GetLastError();
            cout<<"dwError =="<<dwError<<endl;
            if (dwError != ERROR_IO_PENDING)
            {
                cout<<"dwError != ERROR_IO_PENDING, so quit,dwError =="<<dwError<<endl;
                return ;
            }
            else //
            {
                cout<<"HttpSendRequest, so run WaitExitEvent"<<endl;
                Sleep(3000);
                //if(WaitExitEvent()!=2)//; // 等待成功創建 等待是否不對???
                {
                       cout<<"had not recv complete event, so quit"<<endl;
                    // return ;
                }
            }
        }
       
    }
    Sleep(3000);
    cout << "step 4: HttpSendRequest success!"<<endl;

    int bufh[1000];
    DWORD dwLen,dwIndex;
    /*if(!::HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, bufh, &dwLen, &dwIndex))// 這句話???
    {
        //return E_FAIL;
        return;
    }
*/
    // 判斷狀態碼;
    char m_dwStatusCode[90];
    DWORD dwStatusSize = sizeof(m_dwStatusCode);
    /*if (FALSE == ::HttpQueryInfo(hRequest,   // 查詢失效??
        HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
        &m_dwStatusCode,
        &dwStatusSize,
        NULL))   //獲取返回狀態碼
    {
        return ;
    }
    //判斷狀態碼是不是 200
    //if (HTTP_STATUS_OK != m_dwStatusCode)
    {
        //return ;
    }
*/

    DWORD dwByteToRead = 0;
    DWORD dwSizeOfRq = 4;
    DWORD dwBytes = 0;
    //這三個值分別存儲文件的大小,HttpQueryInfo內容的大小和總共讀取的字節數。
    //HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL);
    //需要說明的是 HttpQueryInfo 并不進行網絡操作,因此它不需要進行異步操作的處理。
    if (!HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
    { // 這里失敗了???
       
        DWORD dwError = ::GetLastError();
        cout<<"HttpQueryInfo failed, so return, GetLastError() =="<<dwError<<endl;
        return ;
    }
    FILE * pFile = fopen("e://baidu01.exe", "wb" );
    //ofstream mfile("out.txt");//定義文件輸出流ouf,并關聯到out.txt
    int i=0;
    DWORD leftB = dwByteToRead;
    cout<<"開始下載"<<endl;
    if( !ASYNC) // 同步下載
    {
        while(true)
        {
            const int MAX_BUFFER_SIZE = 65536;
            unsigned long nSize = 0;
            char szBuffer[MAX_BUFFER_SIZE+2];
            int num = MAX_BUFFER_SIZE;
            if( leftB < num);
            num = leftB;
            BOOL bRet = ::InternetReadFile(hRequest, szBuffer, num, &nSize); // 異步 需要等待

            leftB -= nSize;
            cout<<i++<<" size: "<<nSize<<endl;
            if(!bRet || nSize <= 0)
                break;
            fwrite(szBuffer, sizeof(char), nSize, pFile);
        }
    }
    else // 異步下載
    {
        INTERNET_BUFFERS i_buf = {0};
        i_buf.dwStructSize = sizeof(INTERNET_BUFFERS);
        i_buf.lpvBuffer = new TCHAR[10242];
        i_buf.dwBufferLength = 10240;
         for( DWORD i=0;i<dwByteToRead;)
        {
            //重置讀數據事件
            ::ResetEvent( hEvent[0]);
            int num = 10240;
            if(dwByteToRead-i<10240)
            {
                num = dwByteToRead-i;
                   i_buf.dwBufferLength = dwByteToRead-i;
            }
            if (FALSE == ::InternetReadFileEx(hRequest,
                &i_buf,
                IRF_ASYNC,
                NULL))
            {
                if (ERROR_IO_PENDING == ::GetLastError())
                {
                    if ( NULL)//WaitExitEvent()!=2)
                    {
                        delete[] i_buf.lpvBuffer;
                        return ;
                    }
                }
                else
                {
                    cout<<"down failed,so return"<<endl;
                    delete[] i_buf.lpvBuffer;
                    return ;
                }
            }
            else
            {
                //在網絡傳輸速度快,步長較小的情況下,
                //InternetReadFileEx 經常會直接返回成功,
                //因此要判斷是否發生了用戶要求終止子線程事件。
                cout<<"網絡很好,InternetReadFileEx返回true"<<endl;

                // 暫不考慮用戶退出
            }
            i += i_buf.dwBufferLength; // 最后一次寫多了!!!
            fwrite(i_buf.lpvBuffer, sizeof(char), i_buf.dwBufferLength, pFile);
            cout<<"i== "<<i<<endl;
            //保存數據
             //通知主線程下載進度
                   
        }
    }
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    cout<<"success download file"<<endl;
   
    return;
}

int main( void )
{
   
    WinINet3(true,true);
    return 1;
}

void OnInternetHandleCreated(HINTERNET hInternet, LPINTERNET_ASYNC_RESULT lpInetStatusResult)
{
    if(NULL == lpInetStatusResult)
    {
        //ATLASSERT( 0 );
        return;
    }
    hFile = HINTERNET(lpInetStatusResult->dwResult);
    HINTERNET    hInet = HINTERNET(lpInetStatusResult->dwResult);
    DWORD        dwInetHandleType;
    DWORD        dwTypeLen = sizeof(dwInetHandleType);

    InternetQueryOption( hInet, INTERNET_OPTION_HANDLE_TYPE, &dwInetHandleType, &dwTypeLen);
    switch(dwInetHandleType)
    {
    case INTERNET_HANDLE_TYPE_CONNECT_HTTP:
        //CloseInternetConnection(); //   這里是何意???? 通過回調 設置httpConnect
        hConnect = hInet;     //
        break;
    case INTERNET_HANDLE_TYPE_HTTP_REQUEST:
        //CloseInternetFile();    //    這里是何意??    通過回調 設置httpFile
        hRequest = hInet;    //
        break;
    default:
        break;
    }
    cout<<"OnInternetHandleCreated, so ::SetEvent(hEvent[0])"<<endl;
    // HANDLE已創建事件(異步控制)
    ::SetEvent(hEvent[0]);
}
void OnInternetRequestComplete(HINTERNET hInternet, LPINTERNET_ASYNC_RESULT lpInetStatusResult)
{

    if( lpInetStatusResult == NULL )
    {
        //ATLASSERT( 0 );
        return;
    }
    cout<<"OnInternetRequestComplete, so ::SetEvent(hEvent[2])"<<endl;
    // 激發請求完成事件(異步控制)
    ::SetEvent(hEvent[0]);
}

void CALLBACK InternetStatusCallback(
                                    HINTERNET hInternet,
                                    DWORD_PTR dwContext,
                                    DWORD dwInternetStatus,
                                    LPVOID lpvStatusInformation,
                                    DWORD dwStatusInformationLength
                                    )
{
    cout<<"進入回調"<<endl;
    switch (dwInternetStatus)
    {
    case INTERNET_STATUS_RESOLVING_NAME:
        break;
    case INTERNET_STATUS_NAME_RESOLVED:
        break;
    case INTERNET_STATUS_CONNECTING_TO_SERVER:
        break;
    case INTERNET_STATUS_CONNECTED_TO_SERVER:
        break;
    case INTERNET_STATUS_SENDING_REQUEST:
        break;
    case INTERNET_STATUS_REQUEST_SENT:
        break;
    case INTERNET_STATUS_RECEIVING_RESPONSE:
        break;
    case INTERNET_STATUS_RESPONSE_RECEIVED:
        break;
    case INTERNET_STATUS_CLOSING_CONNECTION:
        break;
    case INTERNET_STATUS_CONNECTION_CLOSED:
        break;
    case INTERNET_STATUS_HANDLE_CREATED:
        cout<<"回調是INTERNET_STATUS_HANDLE_CREATED"<<endl;
        OnInternetHandleCreated(hInternet, LPINTERNET_ASYNC_RESULT(lpvStatusInformation)); // 傳遞了HINTERNET 這是精髓呀
        break;
    case INTERNET_STATUS_HANDLE_CLOSING:
        break;
    case INTERNET_STATUS_REQUEST_COMPLETE:
        cout<<"回調是INTERNET_STATUS_REQUEST_COMPLETE"<<endl;
        OnInternetRequestComplete(hInternet, LPINTERNET_ASYNC_RESULT(lpvStatusInformation));
        break;
    case INTERNET_STATUS_REDIRECT:
    case INTERNET_STATUS_INTERMEDIATE_RESPONSE:
    case INTERNET_STATUS_STATE_CHANGE:
    default:
        break;
    }
}

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久成人精品视频| 久久久国产精品一区| 亚洲国产精品综合| 久久精品国产一区二区三| 国产模特精品视频久久久久 | 欧美日韩一区高清| 亚洲视频免费观看| 亚洲性夜色噜噜噜7777| 国产日韩精品一区二区浪潮av| 欧美一区网站| 久久精品日韩| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美一区二区三区男人的天堂| 国产日韩欧美制服另类| 美女主播一区| 欧美另类一区| 亚洲欧美怡红院| 性欧美18~19sex高清播放| 亚洲一区二区三区四区五区黄| 国产日韩精品在线| 欧美成在线观看| 欧美精品18videos性欧美| 亚洲欧美激情视频| 久久久久成人网| 一本色道久久综合亚洲91| 亚洲欧美视频一区| 欧美日韩一区二区三区在线视频| 午夜国产精品视频| 久久久99爱| 亚洲男女毛片无遮挡| 久久久精品国产免大香伊| 亚洲视频碰碰| 久久亚洲精品一区二区| 亚洲小说春色综合另类电影| 久久激情久久| 亚洲午夜女主播在线直播| 久久久中精品2020中文| 亚洲一区久久久| 久久综合色播五月| 久久爱www| 欧美日本免费| 欧美激情一区| 国产无一区二区| 亚洲美女视频| 亚洲精品免费观看| 久久国产欧美日韩精品| 亚洲欧美国产77777| 欧美成熟视频| 免费在线欧美黄色| 国产日韩在线一区| 亚洲一区二区三区中文字幕| 亚洲另类春色国产| 玖玖在线精品| 久久久久久久综合狠狠综合| 国产精品电影网站| 亚洲免费激情| 99精品国产99久久久久久福利| 亚洲高清免费视频| 合欧美一区二区三区| 老色鬼久久亚洲一区二区| 国产精品综合网站| 亚洲视频在线二区| 亚洲一区精品在线| 欧美午夜影院| 一本到高清视频免费精品| 亚洲免费精彩视频| 欧美精品黄色| 亚洲精品永久免费精品| 99亚洲视频| 欧美美女bbbb| 99精品欧美一区二区三区| 亚洲无亚洲人成网站77777| 欧美人成网站| 99riav久久精品riav| 一本色道久久综合| 国产精品久久久久久久久借妻| 99精品国产99久久久久久福利| 亚洲夜间福利| 国产精品亚洲一区| 欧美在线视频一区二区| 久久伊人精品天天| 亚洲精品男同| 国产精品av久久久久久麻豆网| 亚洲婷婷综合久久一本伊一区| 亚洲欧美电影院| 韩国v欧美v日本v亚洲v| 噜噜爱69成人精品| 亚洲精品日韩在线观看| 午夜精品福利在线观看| 国产亚洲一区二区在线观看 | 免费在线欧美视频| 日韩亚洲精品视频| 国产乱理伦片在线观看夜一区| 欧美一区激情视频在线观看| 欧美成人激情在线| 亚洲调教视频在线观看| 国产亚洲欧洲997久久综合| 久久午夜激情| 一本色道久久综合狠狠躁篇的优点 | 国产麻豆综合| 嫩草影视亚洲| 乱中年女人伦av一区二区| 亚洲精品网址在线观看| 国产欧美日本一区视频| 开心色5月久久精品| 在线亚洲伦理| 欧美电影专区| 欧美资源在线| 99re视频这里只有精品| 国产主播精品| 欧美色精品天天在线观看视频| 欧美在线高清| 在线天堂一区av电影| 欧美成人精品不卡视频在线观看| 亚洲一区在线观看视频 | 国产网站欧美日韩免费精品在线观看| 久久亚裔精品欧美| 亚洲欧美精品| 亚洲免费av片| 欧美高清影院| 久久这里有精品视频| 亚洲男同1069视频| 99国产精品久久久久老师| 国产精品综合网站| 欧美午夜视频在线| 欧美电影免费网站| 久热精品视频在线| 久久国产视频网站| 亚洲欧美日本日韩| 亚洲午夜高清视频| 日韩五码在线| 亚洲精选在线| 亚洲欧洲日本在线| 欧美激情亚洲视频| 欧美成人精品一区| 久久综合色婷婷| 久久久久久免费| 久久精品视频导航| 久久国产精品电影| 久久电影一区| 久久精品国产清高在天天线| 午夜宅男欧美| 欧美在线观看一区| 欧美一级视频免费在线观看| 亚洲专区一二三| 亚洲欧美国产视频| 午夜精品久久久久久久99樱桃| 亚洲视频在线观看网站| 在线中文字幕一区| 亚洲男人的天堂在线观看| 亚洲欧美日韩中文视频| 亚洲欧美日本在线| 欧美一区二区三区久久精品茉莉花 | 国产精品不卡在线| 国产精品v日韩精品v欧美精品网站 | 欧美激情一区二区三区全黄| 欧美成人综合一区| 亚洲人成毛片在线播放| 亚洲精品看片| 亚洲视频在线观看网站| 午夜精品久久久久久久蜜桃app| 午夜久久久久久| 久久久久国产免费免费| 麻豆成人小视频| 欧美日韩国产在线观看| 国产精品久久久久久久9999| 国产亚洲激情视频在线| 曰韩精品一区二区| 一区二区高清在线| 欧美一区免费视频| 欧美不卡视频一区发布| 亚洲精品欧美极品| 午夜亚洲福利| 你懂的国产精品永久在线| 欧美午夜免费| 韩曰欧美视频免费观看| 日韩五码在线| 久久精品亚洲国产奇米99| 亚洲国产高清一区| 亚洲一区视频在线| 免费在线观看精品| 国产美女精品视频免费观看| 亚洲国产视频一区| 羞羞色国产精品| 亚洲国产一区二区a毛片| 亚洲网站视频福利| 欧美ab在线视频| 国产日韩欧美一区| 夜色激情一区二区| 另类春色校园亚洲| 正在播放欧美视频| 欧美成人日韩| 国产专区欧美专区| 亚洲欧美综合网| 91久久久久久| 久热国产精品视频| 国产亚洲电影| 亚洲视频图片小说| 亚洲国产另类久久精品| 欧美中文字幕第一页|