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

隨筆 - 224  文章 - 41  trackbacks - 0
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

享受編程

常用鏈接

留言簿(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>
            国产精品第十页| 亚洲欧美日本在线| 亚洲天堂久久| 一本一本a久久| 中文欧美在线视频| 午夜精品福利视频| 欧美一区免费| 久久久国产成人精品| 免费成人av| 亚洲精品永久免费| 一级日韩一区在线观看| 亚洲在线一区二区| 久久精品国产亚洲5555| 欧美高清在线观看| 国产精品美女xx| 国外视频精品毛片| 最新国产成人在线观看| 一本色道久久88精品综合| 亚洲女性裸体视频| 理论片一区二区在线| 亚洲精品欧美在线| 午夜免费电影一区在线观看| 久久中文在线| 国产精品sss| 亚洲大胆人体在线| 香蕉av777xxx色综合一区| 欧美1区2区视频| 宅男精品导航| 欧美激情亚洲| 一区视频在线看| 亚洲在线播放电影| 欧美成人影音| 欧美一级久久久| 欧美精品成人在线| 精品1区2区3区4区| 亚洲欧美怡红院| 韩国女主播一区二区三区| 亚洲美女黄色| 久久一区二区三区四区五区| 日韩一二三在线视频播| 久久九九免费视频| 国产欧美日韩在线播放| 一区二区三区免费网站| 欧美11—12娇小xxxx| 欧美亚洲专区| 国产精品久久久久久影视| 亚洲欧洲综合| 欧美黄网免费在线观看| 久久精视频免费在线久久完整在线看| 国产精品对白刺激久久久| 亚洲人成人一区二区三区| 毛片av中文字幕一区二区| 亚洲欧美综合一区| 国产乱码精品一区二区三| 亚洲一区欧美| 洋洋av久久久久久久一区| 欧美激情bt| 亚洲人屁股眼子交8| 欧美大片网址| 老色鬼精品视频在线观看播放| 国产在线视频不卡二| 欧美亚洲尤物久久| 性色av一区二区三区红粉影视| 国产精品毛片一区二区三区| 亚洲欧美日韩综合| 在线亚洲欧美视频| 国产精品男女猛烈高潮激情| 亚洲一区二区三区四区五区黄| 99天天综合性| 欧美性猛交一区二区三区精品| 亚洲视频香蕉人妖| 亚洲午夜av在线| 国产精品美女一区二区在线观看| 亚洲一区国产视频| 香蕉久久夜色精品国产使用方法| 国产一区二区三区四区hd| 久久先锋影音| 免费不卡在线观看| 日韩一区二区精品| 亚洲无线观看| 激情成人av| 亚洲国产精品免费| 欧美a级一区| 99综合在线| 亚洲欧美激情四射在线日 | 91久久午夜| 欧美午夜欧美| 久久久国产精品一区二区三区| 欧美亚洲专区| 亚洲精品一区二区三区樱花 | 一本色道久久88亚洲综合88| 欧美在线短视频| 在线成人激情| 亚洲无人区一区| 亚洲国产精品v| 一区二区三区欧美在线观看| 国产最新精品精品你懂的| 亚洲成色www8888| 国产精品对白刺激久久久| 久久婷婷人人澡人人喊人人爽| 欧美久久精品午夜青青大伊人| 亚洲欧美一区二区三区久久| 蜜桃久久av一区| 性久久久久久久久| 欧美va亚洲va国产综合| 篠田优中文在线播放第一区| 久久一区精品| 欧美一区二区精美| 欧美精品久久久久久久| 久久大综合网| 欧美天天视频| 亚洲国产欧美日韩精品| 国产日韩欧美综合| 99国产精品国产精品久久| 尤物yw午夜国产精品视频| 亚洲午夜精品网| 亚洲精品国产精品国产自| 午夜精品剧场| 亚洲永久精品大片| 免费在线成人| 久久精品视频在线看| 国产精品激情偷乱一区二区∴| 欧美福利视频一区| 狠狠入ady亚洲精品| 一区二区三区视频在线看| 亚洲激情自拍| 久久亚洲国产精品日日av夜夜| 欧美一级片一区| 欧美视频中文在线看| 亚洲高清在线观看| 亚洲电影观看| 噜噜噜91成人网| 欧美电影免费观看大全| 红桃视频欧美| 先锋影音国产精品| 欧美一区二区三区视频免费| 国产精品草莓在线免费观看| 99精品视频网| 亚洲自拍偷拍视频| 国产精品国产三级国产普通话三级 | 久久av在线| 久久视频精品在线| 国产一区二区高清| 久久精品人人做人人综合| 久久久久久久国产| 激情亚洲网站| 久久综合伊人77777| 欧美大片免费| 亚洲最新视频在线| 国产精品vvv| 小处雏高清一区二区三区| 狠狠久久亚洲欧美| 卡通动漫国产精品| 亚洲国产精品第一区二区| 亚洲剧情一区二区| 欧美午夜免费影院| 欧美在线观看视频在线| 美女精品自拍一二三四| 日韩视频免费大全中文字幕| 欧美日韩一卡二卡| 性欧美暴力猛交另类hd| 欧美wwwwww| 一本久久综合| 国产三区二区一区久久| 久久综合网色—综合色88| 亚洲国产欧美一区二区三区丁香婷| 一区二区日韩伦理片| 国产伦精品一区| 裸体女人亚洲精品一区| 一本一本大道香蕉久在线精品| 久久狠狠婷婷| 一区二区高清视频| 国产香蕉97碰碰久久人人| 欧美国产精品日韩| 性欧美大战久久久久久久久| 亚洲国产精品久久人人爱蜜臀| 午夜精品在线| 亚洲精品国产品国语在线app| 国产精品久久久久久av福利软件 | 国产精品久久久久aaaa九色| 久久超碰97人人做人人爱| 亚洲精品日韩在线观看| 久久久噜噜噜久久人人看| 在线亚洲一区| 亚洲欧洲在线观看| 精品av久久久久电影| 国产精品乱码| 欧美日本中文| 久久久久se| 亚洲永久在线| 亚洲精品综合| 欧美国产另类| 久久久精品午夜少妇| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲福利视频网| 国产亚洲欧美中文| 国产精品免费视频xxxx| 欧美日韩视频专区在线播放 | 亚洲三级免费观看| 欧美大片免费观看在线观看网站推荐|