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

隨筆 - 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)) // 為什么失?。浚浚?br>    {
        //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>
            久久久久国产精品一区三寸| 午夜精品久久久久99热蜜桃导演| 久久精品欧美| 一区二区三区久久精品| 欧美激情一区二区三区不卡| 国产亚洲欧洲一区高清在线观看| 日韩视频―中文字幕| 国产精品久久中文| 亚洲国产美国国产综合一区二区| 欧美成人免费在线| 亚洲国产一区二区精品专区| 亚洲无亚洲人成网站77777| 国产精品高潮呻吟久久av无限| 欧美超级免费视 在线| 欧美成年人在线观看| 欧美成人一区在线| 99精品国产热久久91蜜凸| 亚洲欧洲一区二区三区久久| 午夜宅男久久久| 欧美中文在线视频| 亚洲视频网在线直播| 午夜激情亚洲| 欧美激情精品久久久久久久变态 | 欧美韩日一区二区| 亚洲国产精品传媒在线观看 | 欧美一区二区三区在线看| 国产精品久久久久久户外露出| 亚洲精选中文字幕| 亚洲人成人一区二区在线观看| 激情综合色丁香一区二区| 欧美一区二区三区在线| 久久久久.com| 香蕉久久a毛片| 韩国精品在线观看| 欧美日韩在线免费| 亚洲欧美日韩在线| 久久综合综合久久综合| 亚洲看片免费| 性久久久久久久久久久久| 欧美区亚洲区| 在线观看三级视频欧美| 中文在线不卡| 亚洲国产精品久久| 久久精品亚洲一区二区| 欧美三日本三级少妇三2023| 亚洲国产精品一区制服丝袜| 欧美中在线观看| 亚洲午夜伦理| 欧美午夜a级限制福利片| 91久久久久久久久| 巨乳诱惑日韩免费av| 亚洲欧美www| 国产精品二区在线| 亚洲欧美国产高清| 亚洲一区二区三区精品在线观看 | 午夜视频一区| 亚洲欧洲一区二区在线播放| 美女日韩在线中文字幕| 亚洲福利电影| 欧美黄色aa电影| 另类av一区二区| 亚洲国产精品一区二区www| 美女视频一区免费观看| 欧美伊久线香蕉线新在线| 国产精品一区2区| 久久精品一区中文字幕| 久久久久久夜精品精品免费| 国产一区二区| 欧美成人午夜激情| 欧美美女喷水视频| 亚洲午夜免费视频| 亚洲欧美日韩中文在线制服| 国内精品美女在线观看| 欧美激情日韩| 欧美日韩精品是欧美日韩精品| 99国产麻豆精品| 亚洲乱码精品一二三四区日韩在线 | 亚洲成色最大综合在线| 免费h精品视频在线播放| 国产欧美一区二区三区久久| 一本色道精品久久一区二区三区| 亚洲一区在线免费| 国产日产欧美精品| 欧美福利在线| 国产精品v欧美精品v日韩| 久久成人精品一区二区三区| 另类图片国产| 亚洲一区三区视频在线观看 | 麻豆精品一区二区av白丝在线| 麻豆乱码国产一区二区三区| 日韩视频免费观看高清在线视频| 日韩亚洲欧美综合| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲第一毛片| 国产精品成人播放| 奶水喷射视频一区| 国产精品久久久99| 欧美aaaaaaaa牛牛影院| 欧美日韩在线视频一区二区| 久久久成人精品| 欧美日韩天天操| 亚洲桃色在线一区| 国产亚洲亚洲| 日韩网站在线看片你懂的| 国产欧美在线播放| 亚洲人久久久| 亚洲成人资源网| 亚洲永久免费精品| 亚洲精品一区二区三区樱花| 新67194成人永久网站| 99在线精品视频| 久久九九热re6这里有精品| 亚洲综合精品| 欧美日韩视频在线第一区| 欧美3dxxxxhd| 国内精品久久久久久| 亚洲网站视频福利| 一区二区三区三区在线| 蜜桃久久av| 久久综合色天天久久综合图片| 欧美四级在线观看| 91久久极品少妇xxxxⅹ软件| 国产一区久久| 午夜精彩国产免费不卡不顿大片| 日韩视频一区二区三区| 久久人人超碰| 久久久精彩视频| 国产精品视频区| 亚洲欧洲在线一区| 亚洲日韩成人| 欧美成人小视频| 亚洲国产99| 亚洲国产一区二区三区高清| 久久精品国产亚洲a| 久久精品免费观看| 国产日韩欧美在线看| 亚洲男人的天堂在线aⅴ视频| 国产精品99久久久久久www| 欧美精品一区二区精品网| 亚洲国产专区校园欧美| 亚洲精品久久久一区二区三区| 久久午夜影视| 亚洲黄色av一区| 在线一区二区三区四区| 欧美日韩综合网| 中文欧美在线视频| 久久精品国产亚洲一区二区| 精品1区2区| 欧美99久久| 亚洲精品视频免费在线观看| 一区二区三区视频在线播放| 欧美性天天影院| 欧美一级大片在线免费观看| 久久综合色婷婷| 亚洲精品一级| 国产精品你懂的在线欣赏| 亚洲午夜激情网站| 久久久夜精品| 亚洲免费大片| 国产精品入口66mio| 欧美一区二区三区精品| 欧美激情一区二区三区| 亚洲一区在线直播| 在线观看的日韩av| 欧美国产成人精品| 亚洲一区高清| 亚洲第一级黄色片| 香港久久久电影| 在线观看欧美成人| 国产精品成人久久久久| 久久久久久亚洲精品杨幂换脸| 亚洲电影免费观看高清完整版| 亚洲香蕉视频| 1769国内精品视频在线播放| 欧美日韩一区二区三区四区在线观看| 亚洲一二三区精品| 亚洲第一天堂av| 久久精品国产精品亚洲精品| 亚洲美女91| 国产一区二区三区在线观看网站| 噜噜噜91成人网| 亚洲男人第一av网站| 亚洲国产91| 久久久久在线观看| 亚洲欧美一区二区三区久久 | 亚洲一级黄色片| 在线日韩av片| 国产精品亚洲综合色区韩国| 欧美成人综合网站| 久久久久久久91| 亚洲免费影视第一页| 亚洲人永久免费| 久久久亚洲一区| 欧美一区二视频在线免费观看| 亚洲卡通欧美制服中文| 91久久国产自产拍夜夜嗨| 黑人巨大精品欧美黑白配亚洲| 欧美在线观看视频一区二区| 日韩一级黄色av| 亚洲激情图片小说视频|