日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libcurl使用方法

發布時間:2024/8/23 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libcurl使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://curl.haxx.se/libcurl/c/libcurl-tutorial.html

??? 譯者:JGood(http://blog.csdn.net/JGood?)

??? 譯者注:這是一篇介紹如何使用libcurl的入門教程。文檔不是逐字逐句按原文翻譯,而是根據筆者對libcurl的理解,參考原文寫成。文中用到的一些例子,可能不是出自原文,而是筆者在學習過程中,寫的一些示例程序(筆者使用的libcurl版本是:7.19.6)。出現在這里主要是為了更好的說明libcurl的某些api函數的使用。許多例子都參考libcurl提供的example代碼。原文example中的提供的示例程序完全使用C語言,而這里筆者提供的例子使用C++語言。因為能力有限,對于libcurl的某些理解和使用可能有誤,歡迎批評指正。

?

目標

??? 本文檔介紹了在應用程序開發過程中,如何正確使用libcurl的基本方式和指導原則。文檔使用C語言來調用libcurl的接口,當然也適用于其他與C語言接近的語言。

??? 文檔主要針對使用libcurl來進行開發的人員。文檔所摜的應用程序泛指你寫的源代碼,這些代碼使用了libcurl進行數據傳輸。

??? 更多關于libcurl的功能和接口信息,可以在相關的主頁上查閱。

編譯源碼

??? 有很多種不同的方式來編譯C語言代碼。這里使用UNIX平臺下的編譯方式。即使你使用的是其他的操作系統,你仍然可以通過閱讀本文檔來獲取許多有用的信息。

編譯

??? 你的編譯器必須知道libcurl頭文件的位置。所以在編譯的時候,你要設置頭文件的包含路徑。可以使用curl-config工具來獲取這方面的信息:

??? $ curl-config –cflags

鏈接

??? 編譯完源碼(這時的源代碼不是指libcurl的源代碼,你是你自己寫的程序代碼)之后,你還必須把目標文件鏈接成單個可執行文件。你要鏈接libcurl庫,以及libcurl所依賴的其他庫,例如OpenSLL庫。當然可能還需要一些其他的操作系統庫。最后你還要設置一些編譯選項,當然可以使用curl-config工具簡化操作:

??? $curl-config –libs

是否使用SSL

??? 定制編譯libcurl。與其他庫不同的是,libcurl可以定制編譯,根據實際需要是否支持某些特性,如是否支持SSL傳輸,像HTTPS和FTPS。如果決定需要支持SSL,必須在編譯時正確的設置。可以使用’curl-config’來判斷libcurl庫是否支持SSL:

??? $ curl-config –feature

autoconf宏

??? 當你編寫配置腳本來檢測libcurl及其相應設置時,你可以使用預定義宏。文檔docs/libcurl/libcurl.m4告訴你如何使用這些宏。

跨平臺的可移植的代碼

??? libcurl的開發人員花費很大的努力,使libcurl盡可能在大多數平臺上正常運行。

全局初始化

??? 應用程序在使用libcurl之前,必須先初始化libcurl。libcurl只需初始化一次。可以使用以下語句進行初始化:

curl_global_init();

??? curl_global_init()接收一個參數,告訴libcurl如何初始化。參數CURL_GLOBAL_ALL?會使libcurl初始化所有的子模塊和一些默認的選項,通常這是一個比較好的默認參數值。還有兩個可選值:

CURL_GLOBAL_WIN32

??? 只能應用于Windows平臺。它告訴libcurl初始化winsock庫。如果winsock庫沒有正確地初始化,應用程序就不能使用socket。在應用程序中,只要初始化一次即可。

CURL_GLOBAL_SSL

??? 如果libcurl在編譯時被設定支持SSL,那么該參數用于初始化相應的SSL庫。同樣,在應用程序中,只要初始化一次即可。

??? libcurl有默認的保護機制,如果在調用curl_easy_perform時它檢測到還沒有通過curl_global_init進行初始化,libcurl會根據當前的運行時環境,自動調用全局初始化函數。但必須清楚的是,讓系統自已初始化不是一個好的選擇。

??? 當應用程序不再使用libcurl的時候,應該調用curl_global_cleanup來釋放相關的資源。

??? 在程序中,應當避免多次調用curl_global_init和curl_global_cleanup。它們只能被調用一次。

libcurl提供的功能

??? 在運行時根據libcurl支持的特性來進行開發,通常比編譯時更好。可以通過調用curl_version_info函數返回的結構體來獲取運行時的具體信息,從而確定當前環境下libcurl支持的一些特性。下面是筆者在visual studio2008中調用相關函數獲取libcurl版本信息的截圖:?
??

使用easy interface

??? 首先介紹libcurl中被稱為easy interface的api函數,所有這些函數都是有相同的前綴:curl_easy 。

??? 當前版本的libcurl也提供了multi interface,關于這些接口的詳細使用,在下面的章節中會有介紹。在使用multi interface之前,你首先應該理解如何使用easy interface。

??? 要使用easy interface,首先必須創建一個easy handle,easy handle用于執行每次操作。基本上,每個線程都應該有自己的easy handle用于數據通信(如果需要的話)。千萬不要在多線程之間共享同一個easy handle。下面的函數用于獲取一個easy handle :

CURL *easy_handle = curl_easy_init();

??? 在easy handle上可以設置屬性和操作(action)。easy handle就像一個邏輯連接,用于接下來要進行的數據傳輸。

??? 使用curl_easy_setopt函數可以設置easy handle的屬性和操作,這些屬性和操作控制libcurl如何與遠程主機進行數據通信。一旦在easy handle中設置了相應的屬性和操作,它們將一直作用該easy handle。也就是說,重復使用easy hanle向遠程主機發出請求,先前設置的屬性仍然生效。

??? easy handle的許多屬性使用字符串(以/0結尾的字節數組)來設置。通過curl_easy_setopt函數設置字符串屬性時,libcurl內部會自動拷貝這些字符串,所以在設置完相關屬性之后,字符串可以直接被釋放掉(如果需要的話)。

??? easy handle最基本、最常用的屬性是URL。你應當通過CURLOPT_URL屬性提供適當的URL:

curl_easy_setopt(easy_handle, CURLOPT_URL, "http://blog.csdn.net/JGood?");

??? 假設你要獲取URL所表示的遠程主機上的資源。你需要寫一段程序用來完成數據傳輸,你可能希望直接保存接收到的數據而不是簡單的在輸出窗口中打印它們。所以,你必須首先寫一個回調函數用來保存接收到的數據。回調函數的原型如下:

size_t write_data(void?*buffer, size_t size, size_t nmemb,?void?*userp);

??? 可以使用下面的語句來注冊回調函數,回調函數將會在接收到數據的時候被調用:

curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data);

??? 可以給回調函數提供一個自定義參數,libcurl不處理該參數,只是簡單的傳遞:

curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &internal_struct);

??? 如果你沒有通過CURLOPT_WRITEFUNCTION屬性給easy handle設置回調函數,libcurl會提供一個默認的回調函數,它只是簡單的將接收到的數據打印到標準輸出。你也可以通過CURLOPT_WRITEDATA屬性給默認回調函數傳遞一個已經打開的文件指針,用于將數據輸出到文件里。

??? 下面是一些平臺相關的注意點。在一些平臺上,libcurl不能直接操作由應用程序打開的文件。所以,如果使用默認的回調函數,同時通過CURLOPT_WRITEDATA屬性給easy handle傳遞一個文件指針,應用程序可能會執行失敗。如果你希望自己的程序能跑在任何系統上,你必須避免出現這種情況。

??? 如果以win32動態連接庫的形式來使用libcurl,在設置CURLOPT_WRITEDATA屬性時,你必須同時?使用CURLOPT_WRITEFUNCTION來注冊回調函數。否則程序會執行失敗(筆者嘗試只傳遞一個打開的文件指針而不顯式設置回調函數,程序并沒有崩潰。可能是我使用的方式不正確。)。

??? 當然,libcurl還支持許多其他的屬性,在接下來的篇幅里,你將會逐步地接觸到它們。調用下面的函數,將執行真正的數據通信:

success = curl_easy_perform(easy_handle);

??? curl_easy_perfrom將連接到遠程主機,執行必要的命令,并接收數據。當接收到數據時,先前設置的回調函數將被調用。libcurl可能一次只接收到1字節的數據,也可能接收到好幾K的數據,libcurl會盡可能多、及時的將數據傳遞給回調函數。回調函數返回接收的數據長度。如果回調函數返回的數據長度與傳遞給它的長度不一致(即返回長度 != size * nmemb),libcurl將會終止操作,并返回一個錯誤代碼。

??? 當數據傳遞結束的時候,curl_easy_perform將返回一個代碼表示操作成功或失敗。如果需要獲取更多有關通信細節的信息,你可以設置CURLOPT_ERRORBUFFER屬性,讓libcurl緩存許多可讀的錯誤信息。

??? easy handle在完成一次數據通信之后可以被重用。這里非常建議你重用一個已經存在的easy handle。如果在完成數據傳輸之后,你創建另一個easy handle來執行其他的數據通信,libcurl在內部會嘗試著重用上一次創建的連接。

??? 對于有些協議,下載文件可能包括許多復雜的子過程:日志記錄、設置傳輸模式、選擇當前文件夾,最后下載文件數據。使用libcurl,你不需要關心這一切,你只需簡單地提供一個URL,libcurl會給你做剩余所有的工作。

??? 下面的這個例子演示了如何獲取網頁源碼,將其保存到本地文件,并同時將獲取的源碼輸出到控制臺上。

/** * @brief libcurl接收到數據時的回調函數 * * 將接收到的數據保存到本地文件中,同時顯示在控制臺上。 ** @param [in] buffer 接收到的數據所在緩沖區* @param [in] size 數據長度* @param [in] nmemb 數據片數量* @param [in/out] 用戶自定義指針* @return 獲取的數據長度*/ size_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p) { FILE *fp = (FILE *)user_p; size_t return_size = fwrite(buffer, size, nmemb, fp); cout << (char *)buffer << endl; return return_size; }int main(int argc, char **argv) { // 初始化libcurl CURLcode return_code; return_code = curl_global_init(CURL_GLOBAL_WIN32); if (CURLE_OK != return_code) { cerr << "init libcurl failed." << endl; return -1; }// 獲取easy handle CURL *easy_handle = curl_easy_init();if (NULL == easy_handle){cerr << "get a easy handle failed." << endl;curl_global_cleanup(); return -1;}FILE *fp = fopen("data.html", "ab+"); // // 設置easy handle屬性 curl_easy_setopt(easy_handle, CURLOPT_URL, http://blog.csdn.net/JGood);curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);// 執行數據請求 curl_easy_perform(easy_handle); // 釋放資源 fclose(fp);curl_easy_cleanup(easy_handle);curl_global_cleanup();return 0; }

?

多線程問題

??? 首先一個基本原則就是:絕對不應該在線程之間共享同一個libcurl handle,不管是easy handle還是multi handle(將在下文中介紹)。一個線程每次只能使用一個handle。

??? libcurl是線程安全的,但有兩點例外:信號(signals)和SSL/TLS handler。 信號用于超時失效名字解析(timing out name resolves)。libcurl依賴其他的庫來支持SSL/STL,所以用多線程的方式訪問HTTPS或FTPS的URL時,應該滿足這些庫對多線程操作的一些要求。詳細可以參考:

??? OpenSSL:?http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION

??? GnuTLS:?http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html

??? NSS: 宣稱是多線程安全的。

什么時候libcurl無法正常工作

??? 傳輸失敗總是有原因的。你可能錯誤的設置了一些libcurl的屬性或者沒有正確的理解某些屬性的含義,或者是遠程主機返回一些無法被正確解析的內容。

??? 這里有一個黃金法則來處理這些問題:將CURLOPT_VERBOSE屬性設置為1,libcurl會輸出通信過程中的一些細節。如果使用的是http協議,請求頭/響應頭也會被輸出。將CURLOPT_HEADER設為1,這些頭信息將出現在消息的內容中。

??? 當然不可否認的是,libcurl還存在bug。當你在使用libcurl的過程中發現bug時,希望能夠提交給我們,好讓我們能夠修復這些bug。你在提交bug時,請同時提供詳細的信息:通過CURLOPT_VERBOSE屬性跟蹤到的協議信息、libcurl版本、libcurl的客戶代碼、操作系統名稱、版本、編譯器名稱、版本等等。

??? 如果你對相關的協議了解越多,在使用libcurl時,就越不容易犯錯。

上傳數據到遠程站點

??? libcurl提供協議無關的方式進行數據傳輸。所以上傳一個文件到FTP服務器,跟向HTTP服務器提交一個PUT請求的操作方式是類似的:

1. 創建easy handle或者重用先前創建的easy handle。

2. 設置CURLOPT_URL屬性。

3. 編寫回調函數。在執行上傳的時候,libcurl通過回調函數讀取要上傳的數據。(如果要從遠程服務器下載數據,可以通過回調來保存接收到的數據。)回調函數的原型如下:

size_t function(char *bufptr, size_t size, size_t nitems, void *userp);

??? bufptr指針表示緩沖區,用于保存要上傳的數據,size * nitems是緩沖區數據的長度,userp是一個用戶自定義指針,libcurl不對該指針作任何操作,它只是簡單的傳遞該指針。可以使用該指針在應用程序與libcurl之間傳遞信息。

4. 注冊回調函數,設置自定義指針。語法如下:

// 注冊回調函數 curl_easy_setopt(easy_handle, CURLOPT_READFUNCTION, read_function); // 設置自定義指針 curl_easy_setopt(easy_handle, CURLOPT_READDATA, &filedata);

5. 告訴libcurl,執行的是上傳操作。

curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1L);

??? 有些協議在沒有預先知道上傳文件大小的情況下,可能無法正確判斷上傳是否結束,所以最好預先使用CURLOPT_INFILESIZE_LARGE屬性:告訴它要上傳文件的大小:

/* in this example, file_size must be an curl_off_t variable */ curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE_LARGE, file_size);

6. 調用curl_easy_perform。

??? 接下來,libcurl將會完成剩下的所有工作。在上傳文件過程中,libcurl會不斷調用先前設置的回調函數,用于將要上傳的數據讀入到緩沖區,并執行上傳。

??? 下面的例子演示如何將文件上傳到FTP服務器。筆者使用的是IIS自帶的FTP服務,同時在FTP上設置了可寫權限。

/*** @brief 讀取數據的回調。*/ size_t read_data(void *buffer, size_t size, size_t nmemb, void *user_p) { return fread(buffer, size, nmemb, (FILE *)user_p); } int main(int argc, char **argv) { // 初始化libcurl CURLcode code;code = curl_global_init(CURL_GLOBAL_WIN32); if (code != CURLE_OK) { cerr << "init libcurl failed." << endl; return -1; } FILE *fp = fopen("a.html", "rb"); if (NULL == fp) {cout << "can't open file." << endl; curl_global_cleanup(); return -1; }// 獲取文件大小 fseek(fp, 0, 2);int file_size = ftell(fp); rewind(fp); // 獲取easy handle CURL *easy_handle = NULL; easy_handle = curl_easy_init(); if (NULL == easy_handle) { cerr << "get a easy handle failed." << endl; fclose(fp); curl_global_cleanup(); return -1;}// 設置eash handle屬性 curl_easy_setopt(easy_handle, CURLOPT_URL, ftp://127.0.0.1/upload.html); curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1L); curl_easy_setopt(easy_handle, CURLOPT_READFUNCTION, &read_data); curl_easy_setopt(easy_handle, CURLOPT_READDATA, fp); curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE_LARGE, file_size); // 執行上傳操作 code = curl_easy_perform(easy_handle); if (code == CURLE_OK) { cout << "upload successfully." << endl; }// 釋放資源 fclose(fp);curl_easy_cleanup(easy_handle);curl_global_cleanup();return 0; }

?

關于密碼

??? 客戶端向服務器發送請求時,許多協議都要求提供用戶名與密碼。libcurl提供了多種方式來設置它們。

??? 一些協議支持在URL中直接指定用戶名和密碼,類似于: protocol://user:password@example.com/path/。libcurl能正確的識別這種URL中的用戶名與密碼并執行相應的操作。如果你提供的用戶名和密碼中有特殊字符,首先應該對其進行URL編碼。

??? 也可以通過CURLOPT_USERPWD屬性來設置用戶名與密碼。參數是格式如 “user:password ”的字符串:

curl_easy_setopt(easy_handle, CURLOPT_USERPWD, "user_name:password");

??? (下面這幾段文字我理解地模模糊糊)有時候在訪問代理服務器的時候,可能時時要求提供用戶名和密碼進行用戶身份驗證。這種情況下,libcurl提供了另一個屬性CURLOPT_PROXYUSERPWD:

curl_easy_setopt(easy_handle, CURLOPT_PROXYUSERPWD, "user_name:password");

??? 在UNIX平臺下,訪問FTP的用戶名和密碼可能會被保存在$HOME/.netrc文件中。libcurl支持直接從這個文件中獲取用戶名與密碼:

curl_easy_setopt(easy_handle, CURLOPT_NETRC, 1L);

??? 在使用SSL時,可能需要提供一個私鑰用于數據安全傳輸,通過CURLOPT_KEYPASSWD來設置私鑰:

curl_easy_setopt(easy_handle, CURLOPT_KEYPASSWD, "keypassword");

?

HTTP驗證

??? 上一章介紹了如何在libcurl中,對需要身份驗證的URL設置用戶名與密碼。在使用HTTP協議時,客戶端有很多種方式向服務器提供驗證信息。默認的HTTP驗證方法是"Basic”,它將用戶名與密碼以明文的方式、經Base64編碼后保存在HTTP請求頭中,發往服務器。當然這不太安全。

??? 當前版本的libcurl支持的驗證方法有:basic, Digest, NTLM, Negotiate, GSS-Negotiate and SPNEGO。(譯者感嘆:搞Web這么多年,盡然不知道這些Http的驗證方式,實在慚愧。)可以通過CURLOPT_HTTPAUTH屬性來設置具體的驗證方式:

curl_easy_setopt(easy_handle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);

??? 向代理服務器發送驗證信息時,可以通過CURLOPT_PROXYAUTH設置驗證方式:

curl_easy_setopt(easy_handle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);

??? 也可以同時設置多種驗證方式(通過按位與), 使用‘CURLAUTH_ANY‘將允許libcurl可以選擇任何它所支持的驗證方式。通過CURLOPT_HTTPAUTH或CURLOPT_PROXYAUTH屬性設置的多種驗證方式,libcurl會在運行時選擇一種它認為是最好的方式與服務器通信:

curl_easy_setopt(easy_handle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST|CURLAUTH_BASIC); // curl_easy_setopt(easy_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

?

HTTP Post

??? 這一章介紹如何使用libcurl以Post方式向HTTP服務器提交數據。

??? 方法一,也是最簡單的方式,就像html中使用<form>標簽提交數據一樣,只需向libcurl提供一個包含數據的字符串即可。下面是筆者學習過程中的一個demo程序:

int main(int argc, char **argv) { code = curl_global_init(CURL_GLOBAL_WIN32); CURL *easy_handle = curl_easy_init(); curl_easy_setopt(easy_handle, CURLOPT_URL, http://localhost:2210/Default.aspx); // 單個域post curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDS, "name=jgood&address=hangzhou");code = curl_easy_perform(easy_handle);curl_easy_cleanup(easy_handle);curl_global_cleanup();return 0; }

??? 在asp.net Web服務器上跟蹤調試,得到客戶程序提交上來的數據,下面是截圖:

??? 上面的代碼夠簡單吧~_~ 有時候,我們需要提交一些二進制數據到HTTP服務器,使用方法一就不行了,因為方法一中實際提交的是一個字符串,字符串遇到/0就表示結束了。所以在上傳二進制數據的時候,必須明確的告訴libcurl要提交的數據的長度。在上傳二進制數據的時候,還應該設置提交的Content-Type頭信息。下面的示例代碼:

int main(int argc, char **argv) { curl_global_init(CURL_GLOBAL_WIN32);CURL *easy_handle = curl_easy_init();// 上傳二進制數據 char data[] = { 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0 }; curl_slist *http_headers = NULL; http_headers = curl_slist_append(http_headers, "Content-Type: text/xml");curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, http_headers);curl_easy_setopt(easy_handle, CURLOPT_URL, http://localhost:2210/Default.aspx); curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDS, data); curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDSIZE, sizeof(data)); curl_easy_perform(easy_handle); curl_slist_free_all(http_headers); curl_easy_cleanup(easy_handle); curl_global_cleanup();return 0; }

??? 在asp.net Web服務器上跟蹤調試,得到客戶程序提交上來的二進制數據,下面是截圖:

???? 上面介紹的兩種方式,可以完成大部分的HTTP POST操作。但上面的兩種方式都不支持multi-part formposts。Multi-part formposts被認為是提交二進制數據(或大量數據)的更好方法,可以在RFC1867, RFC2388中找到他們的定義。何為Multi-part?其實,就我理解,就是在Post提交的時候,有不同的數據單元,每個單元有自己的名稱與內容,內容可以是文本的,也可以是二進制的。同時,每個數據單元都可以有自己的消息頭,MIME類型,這些數據單元組成一個鏈表,提交到HTTP服務器。libcurl提供了方便的api用于支持multi-part formposts。使用curl_formadd函數,可以添加不同的數據數據單元,然后提交到服務器。下面是一個multi-part formposts的例子(更詳細的使用,請參考:http://curl.haxx.se/libcurl/c/curl_formadd.html?):

int main() {

?????????????? curl_global_init(CURL_GLOBAL_WIN32);?
?????????????? CURL *easy_handle = curl_easy_init();

// 使用multi-parts form post curl_easy_setopt(easy_handle, CURLOPT_URL, http://localhost:2210/Default.aspx);curl_httppost *post = NULL;curl_httppost *last = NULL; // 文本數據 curl_formadd(&post, &last, CURLFORM_COPYNAME, "name", CURLFORM_COPYCONTENTS, "JGood", CURLFORM_END);curl_formadd(&post, &last, CURLFORM_COPYNAME, "address", CURLFORM_COPYCONTENTS, "HangZhou", CURLFORM_END);// 文本文件中的數據 curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILECONTENT, "ReadMe.txt", CURLFORM_END); curl_easy_setopt(easy_handle, CURLOPT_HTTPPOST, post); curl_easy_perform(easy_handle);curl_formfree(post); curl_easy_cleanup(easy_handle); curl_global_cleanup(); return 0; }

???? 最后要說明的是,所有在easy handle上設置的屬性都是”sticky”的,什么意思?就是說在easy handle上設置的屬性都將被保存,即使執行完curl_easy_perform之后,這些屬性值仍然存在。通過將CURLOPT_HTTPGET設為1可以使easy handle回到最原始的狀態:

curl_easy_setopt(easy_handle, CURLOPT_HTTPGET, 1L);

?

顯示進度

??? libcurl支持通信過程中的進度控制。通過將CURLOPT_NOPROCESS設置為0開啟進度支持。該選項默認值為1。對大多數應用程序,我們需要提供一個進度顯示回調。libcurl會不定期的將當前傳輸的進度通過回調函數告訴你的程序。回調函數的原型如下:

int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);

??? 通過CURLOPT_PROGRESSFUNCTION注冊該回調函數。參數clientp是一個用戶自定義指針,應用程序通過CURLOPT_PROCESSDATA屬性將該自定義指定傳遞給libcurl。libcurl對該參數不作任何處理,只是簡單將其傳遞給回調函數。

在C++中使用libcurl

??? 在C++中使用libcurl跟在C語言中沒有任何區別,只有一個地方要注意:回調函數不能是類的非靜態成員函數。例如:

class AClass { static size_t write_data(void *ptr, size_t size, size_t nmemb, void *ourpointer) { /* do what you want with the data */ } }

?

代理

??? 什么是代理?Merrian-Webster的解釋是:一個通過驗證的用戶扮演另一個用戶。今天,代理已經被廣泛的使用。許多公司提供網絡代理服務器,允許員工的網絡客戶端訪問、下載文件。代理服務器處理這些用戶的請求。

??? libcurl支持SOCKS和HTTP代理。使用代理,libcurl會把用戶輸入的URL提交給代理服務器,而不是直接根據URL去訪問遠程資源。

??? 當前版本的libcurl并不支持SOCKS代理的所有功能。

??? 對于HTTP代理來說,即使請求的URL不是一個合法的HTTP URL(比方你提供了一個ftp的url),它仍然會先被提交到HTTP代理。

代理選項

??? CURLOPT_PROXY屬性用于設置libcurl使用的代理服務器地址:

curl_easy_setopt(easy_handle, CURLOPT_PROXY, "proxy-host.com:8080");

??? 可以把主機名與端口號分開設置:

curl_easy_setopt(easy_handle, CURLOPT_PROXY, "proxy-host.com"); curl_easy_setopt(easy_handle, CURLOPT_PROXYPORT, "8080"); // 端口號是用字符串還是整數??

??? 有些代理服務器要求用戶通過驗證之后才允許接受其請求,此時應該先提供驗證信息:

curl_easy_setopt(easy_handle, CURLOPT_PROXYUSERPWD, "user:password");

??? 還要告訴libcurl使用的代理類型(如果沒有提供,libcurl會認為是HTTP代理):

curl_easy_setopt(easy_handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
?
環境變量

???? 對于有些協議,libcurl會自動檢測并使用一些環境變量,并根據這些環境變量來確定要使用的代理服務器。這些環境變量的名稱格式一般是"[protocol]_proxy"(注意小寫)。例如輸入一個HTTP的URL,那么名稱為"http_proxy"的環境變量就會被檢測是否存在,如果存在,libcurl會使用該環境變量指定的代理。相同的規則也適用于FTP。

??? 這些環境變量的值的格式必須是這樣的:"[protocol://][user:password@]machine[:port]"。libcurl會忽略掉[protocol://],如果沒有提供端口號,libcurl使用該協議的默認端口。?

??? 有兩個比較特殊的環境變量:'all_proxy'與'no_proxy'。如果一個URL所對應的協議,它的環境變量沒有設置,那么'all_proxy'指定的代理將被使用。'no_proxy'則指定了一個不應被使用的代理主機的列表。例如:no_proxy的值是'192.168.1.10',即使存在http_proxy,它的值也是'192.168.1.10','192.168.1.10'也不會被作為代理。no_proxy=”*”表示不允許使用任何代理。

??? 顯式地將CURLOPT_PROXY屬性設置為空,可以禁止libcurl檢查并使用環境變量來使用代理。

SSL和代理

??? SSL為點到點通信提供安全保障。它包含一些強壯的加密措施和其他安全檢測,這使得上面講到的代理方式不適用于SSL。除非代理服務器提供專用通道,對進出該代理服務器的數據不作任何檢測或禁止。通過HTTP代理服務器打開SSL連接,意味著代理服務器要直接連接到目標主機的指定端口。因為代理服務器對在專用通道上傳輸的數據的類型毫無所知,所以它往往會使某些機制失效,如緩存機制。許多組織只允許在443端口上創建這種類型的數據通道。

代理通道(Tunneling Through Proxy)

??? 正如上面講到的,要使SSL工作必須在代理服務器創建專用數據通道,通常專用通道只被限制應用于HTTPS。通過HTTP代理在應用程序與目標之間創建一個專用數據通道,應該預防在該專有通道上執行非HTTP的操作,如進行FTP上傳或執行FTP命令。代理服務器管理員應該禁止非法的操作。

??? 通過CURLOPT_HTTPPROXYTUNNEL屬性來告訴libcurl使用代理通道:

curl_easy_setopt(easy_handle, CURLOPT_HTTPPROXYTUNNEL, 1L);

???? 有時候你想通過代理通道執行平常的HTTP操作,而實際上卻可能使你不經過代理服務器而直接與遠程主機進行交互。libcurl不會代替這種新引入的行為。

自動配置代理

??? 許多瀏覽器支持自動配置代理,例如NetScape。libcurl并不支持這些。

持久化的好處(Persistence Is The Way to Happiness)

??? 當需要發送多次請求時,應該重復使用easy handle。

??? 每次執行完curl_easy_perform,licurl會繼續保持與服務器的連接。接下來的請求可以使用這個連接而不必創建新的連接(如果目標主機是同一個的話)。這樣可以減少網絡開銷。?
??? 即使連接被釋放了,libcurl也會緩存這些連接的會話信息,這樣下次再連接到目標主機上時,就可以使用這些信息,從而減少重新連接所需的時間。

??? FTP連接可能會被保存較長的時間。因為客戶端要與FTP服務器進行頻繁的命令交互。對于有訪問人數上限的FTP服務器,保持一個長連接,可以使你不需要排除等待,就直接可以與FTP服務器通信。

??? libcurl會緩存DNS的解析結果。

??? 在今后的libcurl版本中,還會添加一些特性來提高數據通信的效率。?
??? 每個easy handle都會保存最近使用的幾個連接,以備重用。默認是5個。可以通過CURLOPT_MAXCONNECTS屬性來設置保存連接的數量。

??? 如果你不想重用連接,將CURLOPT_FRESH_CONNECT屬性設置為1。這樣每次提交請求時,libcurl都會先關閉以前創建的連接,然后重新創建一個新的連接。也可以將CURLOPT_FORBID_REUSE設置為1,這樣每次執行完請求,連接就會馬上關閉。

libcurl使用的HTTP消息頭

???? 當使用libcurl發送http請求時,它會自動添加一些http頭。我們可以通過CURLOPT_HTTPHEADER屬性手動替換、添加或刪除相應的HTTP消息頭。

Host

??? http1.1(大部分http1.0)版本都要求客戶端請求提供這個信息頭。

Pragma

??? "no-cache"。表示不要緩沖數據。

Accept

??? "*/*"。表示允許接收任何類型的數據。

Expect

??? 以POST的方式向HTTP服務器提交請求時,libcurl會設置該消息頭為"100-continue",它要求服務器在正式處理該請求之前,返回一個"OK"消息。如果POST的數據很小,libcurl可能不會設置該消息頭。

自定義選項

??? 當前越來越多的協議都構建在HTTP協議之上(如:soap),這主要歸功于HTTP的可靠性,以及被廣泛使用的代理支持(可以穿透大部分防火墻)。 這些協議的使用方式與傳統HTTP可能有很大的不同。對此,libcurl作了很好的支持。

自定義請求方式(CustomRequest)

??? HTTP支持GET, HEAD或者POST提交請求。可以設置CURLOPT_CUSTOMREQUEST來設置自定義的請求方式,libcurl默認以GET方式提交請求:

curl_easy_setopt(easy_handle, CURLOPT_CUSTOMREQUEST, "MYOWNREQUEST");
?
修改消息頭

??? HTTP協議提供了消息頭,請求消息頭用于告訴服務器如何處理請求;響應消息頭則告訴瀏覽器如何處理接收到的數據。在libcurl中,你可以自由的添加這些消息頭:

struct curl_slist *headers=NULL; /* init to NULL is important */ headers = curl_slist_append(headers, "Hey-server-hey: how are you?"); headers = curl_slist_append(headers, "X-silly-content: yes"); /* pass our list of custom made headers */ curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers); curl_easy_perform(easyhandle); /* transfer http */ curl_slist_free_all(headers); /* free the header list */

??? 對于已經存在的消息頭,可以重新設置它的值:

headers = curl_slist_append(headers, "Accept: Agent-007"); headers = curl_slist_append(headers, "Host: munged.host.line");
?
刪除消息頭

??? 對于一個已經存在的消息頭,設置它的內容為空,libcurl在發送請求時就不會同時提交該消息頭:

headers = curl_slist_append(headers, "Accept:");

?

強制分塊傳輸(Enforcing chunked transfer-encoding)

??? (這段文字理解可能有誤碼)以非GET的方式提交HTTP請求時,如果設置了自定義的消息頭”Transfer-Encoding:chunked”,libcurl會分塊提交數據,即使要上傳的數據量已經知道。在上傳數據大小未知的情況下,libcurl自動采用分塊上傳數據。(譯者注:非GET方式提交請求,提交的數據量往往比較大。)

HTTP版本

??? 每一次http請求,都包含一個表示當前使用http版本的消息頭。libcurl默認使用HTTP 1.1。可以通過CURLOPT_HTTP_VERSION屬性來設置具體的版本號:

curl_easy_setopt(easy_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

?

FTP自定義命令

??? 并不是所以的協議都像HTTP那樣,通過消息頭來告訴服務器如何處理請求。對于FTP,你就要使用另外的方式來處理。

??? 發送自定義的命令到ftp服務器,意味著你發送的命令必須是能被ftp服務器理解的命令(FTP協議中定義的命令,參考rfc959)。

??? 下面是一個簡單的例子,在文件傳輸操作操作之前刪除指定文件:

headers = curl_slist_append(headers, "DELE file-to-remove"); /* pass the list of custom commands to the handle */ curl_easy_setopt(easyhandle, CURLOPT_QUOTE, headers); // curl_easy_setopt(easyhandle, CURLOPT_POSTQUOTE, headers); // 在數據傳輸之后操行刪除操作 curl_easy_perform(easyhandle); /* transfer ftp data! */ curl_slist_free_all(headers); /* free the header list */

??? FTP服務器執行命令的順序,同這些命令被添加到列表中順序是一致的。發往服務器的命令列表中,只要有一個命令執行失敗,ftp服務器就會返回一個錯誤代碼,此時libcurl將直接返回CURLE_QUOTE_ERROR,不再執行剩余的FTP命令。

??? 將CURLOPT_HEADER設置為1,libcurl獲取目標文件的信息,并以HTTP消息頭的樣式來輸出消息頭。

FTP自定義CUSTOMREQUEST

??? 使用CURLOPT_CUSTOMREQUEST屬性,可以向FTP服務器發送命令。"NLST"是ftp默認的列出文件列表的命令。 下面的代碼用于列出FTP服務器上的文件列表:

int main(int argc, char **argv) { curl_global_init(CURL_GLOBAL_WIN32);CURL *easy_handle = curl_easy_init(); curl_easy_setopt(easy_handle, CURLOPT_URL, "ftp://127.0.0.1/"); curl_easy_setopt(easy_handle, CURLOPT_CUSTOMREQUEST, "NLST"); curl_easy_perform(easy_handle);curl_easy_cleanup(easy_handle); curl_global_cleanup(); return 0; }

?

Cookies Without Chocolate Chips

???? cookie是一個鍵值對的集合,HTTP服務器發給客戶端的cookie,客戶端提交請求的時候,也會將cookie發送到服務器。服務器可以根據cookie來跟蹤用戶的會話信息。cookie有過期時間,超時后cookie就會失效。cookie有域名和路徑限制,cookie只能發給指定域名和路徑的HTTP服務器。

??? cookie以消息頭”Set-Cookie”的形式從HTTP服務器發送到客戶端;客戶端發以消息頭”Cookie”的形式將Cookie提交到HTTP服務器。為了對這些東西有個直觀的概念,下圖是FireFox中,使用Firebug跟蹤到的cookie消息頭:?
?

??? 在libcurl中,可以通過CURLOPT_COOKIE屬性來設置發往服務器的cookie:

curl_easy_setopt(easy_handle, CURLOPT_COOKIE, "name1=var1; name2=var2;");

??? 下面的例子演示了如何使用libcurl發送cookie信息給HTTP服務器,代碼非常的簡單:

int main(int argc, char **argv) { curl_global_init(CURL_GLOBAL_WIN32); CURL *easy_handle = curl_easy_init(); curl_easy_setopt(easy_handle, CURLOPT_URL, http://localhost:2210/Default.aspx); curl_easy_setopt(easy_handle, CURLOPT_COOKIE, "name=JGood; address=HangZhou"); curl_easy_perform(easy_handle);curl_easy_cleanup(easy_handle); curl_global_cleanup(); return 0; }

??? 下圖是在ASP.NET Web服務器上調試時跟蹤到的Cookie數據:

???? 在實在的應用場景中,你可能需要保存服務器發送給你的cookie,并在接下來的請求中,把這些cookie一并發往服務器。所以,可以把上次從服務器收到的所有響應頭信息保存到文本文件中,當下次需要向服務器發送請求時,通過CURLOPT_COOKIEFILE屬性告訴libcurl從該文件中讀取cookie信息。?
??? 設置CURLOPT_COOKIEFILE屬性意味著激活libcurl的cookie parser。在cookie parser被激活之前,libcurl忽略所以之前接收到的cookie信息。cookie parser被激活之后,cookie信息將被保存內存中,在接下來的請求中,libcurl會自動將這些cookie信息添加到消息頭里,你的應用程序不需要做任何事件。大多數情況下,這已經足夠了。需要注意的是,通過CURLOPT_COOKIEFILE屬性來激活cookie parser,給CURLOPT_COOKIEFILE屬性設置的一個保存cookie信息的文本文件路徑,可能并不需要在磁盤上物理存在。?
??? 如果你需要使用NetScape或者FireFox瀏覽器的cookie文件,你只要用這些瀏覽器的cookie文件的路徑來初始化CURLOPT_COOKIEFILE屬性,libcurl會自動分析cookie文件,并在接下來的請求過程中使用這些cookie信息。?
??? libcurl甚至能夠把接收到的cookie信息保存成能被Netscape/Mozilla的瀏覽器所識別的cookie文件。通過把這些稱為cookie-jar。通過設置CURLOPT_COOKIEJAR選項,在調用curl_easy_cleanup釋放easy handle的時候,所有的這些cookie信息都會保存到cookie-jar文件中。這就使得cookie信息能在不同的easy handle甚至在瀏覽器之間實現共享。

FTP Peculiarities We Need

??? 在使用FTP協議進行數據傳輸的時候,需要創建兩個連接。第一個連接用于傳輸控制命令,另一個連接用于傳輸數據。(關于FTP的通信過程,請參考這篇文章:http://www.wangjia.net/bo-blog/post/698/)。?FTP通信需要創建兩個連接這個事實往往被很多人忽略。根據第二個連接的發起方是誰,可以分為主動模式與被動模式。libcurl對此都提供了支持。libcurl默認使用被動模式,因為被動模式可以方便的穿透防火墻,NAT等問題。在被動模式下,libcurl要求ftp服務器打開一個新的端口監聽,然后libcurl連接該端口用于數據傳輸。如果使用主動模式,程序必須告訴FTP服務器你監聽的IP與端口,通過設置CURLOPT_FTPPORT屬性來完成。

Headers Equal Fun

??? (這段文字我理解的很模糊,請讀者參考原文)有些協議提供獨立于正常數據的 消息頭、meta-data。正常的數據流里通常不包括 信息頭和元數據。可以將CURLOPT_HEADER設置為1,使信息頭、元數據也能出現在數據流中。libcurl的強大之處在于,它能夠從數據流中解析出消息頭,….

Post Transfer Information

[ curl_easy_getinfo ]

安全考慮

??? 請參考原文,此處略。

使用multi interface同時進行多項傳輸

???? 上面介紹的easy interface以同步的方式進行數據傳輸,curl_easy_perform會一直阻塞到數據傳輸完畢后返回,且一次操作只能發送一次請求,如果要同時發送多個請求,必須使用多線程。?
??? 而multi interface以一種簡單的、非阻塞的方式進行傳輸,它允許在一個線程中,同時提交多個相同類型的請求。 在使用multi interface之前,你應該掌握easy interface的基本使用。因為multi interface是建立在easy interface基礎之上的,它只是簡單的將多個easy handler添加到一個multi stack,而后同時傳輸而已。?
??? 使用multi interface很簡單,首先使用curl_multi_init()函數創建一個multi handler,然后使用curl_easy_init()創建一個或多個easy handler,并按照上面幾章介紹的接口正常的設置相關的屬性,然后通過curl_multi_add_handler將這些easy handler添加到multi handler,最后調用curl_multi_perform進行數據傳輸。?
??? curl_multi_perform是異步的、非阻塞的函數。如果它返回CURLM_CALL_MULTI_PERFORM,表示數據通信正在進行。

??? 通過select()來操作multi interface將會使工作變得簡單(譯者注:其實每個easy handler在低層就是一個socket,通過select()來管理這些socket,在有數據可讀/可寫/異常的時候,通知應用程序)。在調用select()函數之前,應該使用curl_multi_fdset來初始化fd_set變量。

???? select()函數返回時,說明受管理的低層socket可以操作相應的操作(接收數據或發送數據,或者連接已經斷開),此時應該馬上調用curl_multi_perform,libcurl將會執行相應操作。使用select()時,應該設置一個較短的超時時間。在調用select()之前,造成不要忘記通過curl_multi_fdset來初始化fd_set,因為每次操作,fd_set中的文件描述符可能都不一樣。

??? 如果你想中止multi stack中某一個easy handle的數據通信,可以調用curl_multi_remove_handle函數將其從multi stack中取出。千萬另忘記釋放掉easy handle(通過curl_easy_cleanup()函數)。

??? 當multi stack中的一個eash handle完成數據傳輸的時候,同時運行的傳輸任務數量就會減少一個。當數量降到0的時候,說明所有的數據傳輸已經完成。

??? curl_multi_info_read用于獲取當前已經完成的傳輸任務信息,它返回每一個easy handle的CURLcode狀態碼。可以根據這個狀態碼來判斷每個easy handle傳輸是否成功。

??? 下面的例子,演示了如何使用multi interface進行網頁抓取:

int main(int argc, char **argv) { // 初始化 curl_global_init(CURL_GLOBAL_WIN32); CURLM *multi_handle = NULL; CURL *easy_handle1 = NULL; CURL *easy_handle2 = NULL; extern size_t save_sina_page(void *buffer, size_t size, size_t count, void *user_p); extern size_t save_sohu_page(void *buffer, size_t size, size_t count, void *user_p); FILE *fp_sina = fopen("sina.html", "ab+"); FILE *fp_sohu = fopen("sohu.html", "ab+"); multi_handle = curl_multi_init(); // 設置easy handle easy_handle1 = curl_easy_init(); curl_easy_setopt(easy_handle1, CURLOPT_URL, "http://www.sina.com.cn"); curl_easy_setopt(easy_handle1, CURLOPT_WRITEFUNCTION, &save_sina_page); curl_easy_setopt(easy_handle1, CURLOPT_WRITEDATA, fp_sina); easy_handle2 = curl_easy_init(); curl_easy_setopt(easy_handle2, CURLOPT_URL, "http://www.sohu.com"); curl_easy_setopt(easy_handle2, CURLOPT_WRITEFUNCTION, &save_sohu_page); curl_easy_setopt(easy_handle2, CURLOPT_WRITEDATA, fp_sohu); // 添加到multi stack curl_multi_add_handle(multi_handle, easy_handle1); curl_multi_add_handle(multi_handle, easy_handle2); // int running_handle_count; while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &running_handle_count)) { cout << running_handle_count << endl; } while (running_handle_count) { timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; int max_fd; fd_set fd_read; fd_set fd_write; fd_set fd_except; FD_ZERO(&fd_read); FD_ZERO(&fd_write); FD_ZERO(&fd_except); curl_multi_fdset(multi_handle, &fd_read, &fd_write, &fd_except, &max_fd); int return_code = select(max_fd + 1, &fd_read, &fd_write, &fd_except, &tv); if (SOCKET_ERROR == return_code) { cerr << "select error." << endl; break; } else { while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &running_handle_count)) { cout << running_handle_count << endl; } } } // 釋放資源 fclose(fp_sina); fclose(fp_sohu); curl_easy_cleanup(easy_handle1); curl_easy_cleanup(easy_handle2); curl_multi_cleanup(multi_handle); curl_global_cleanup(); return 0; } size_t save_sina_page(void *buffer, size_t size, size_t count, void *user_p) { return fwrite(buffer, size, count, (FILE *)user_p); } size_t save_sohu_page(void *buffer, size_t size, size_t count, void *user_p) { return fwrite(buffer, size, count, (FILE *)user_p); }

?

SSL, 證書,其他技巧

[ seeding, passwords, keys, certificates, ENGINE, ca certs ]

在easy handler之間共享數據

[fill in]

總結

以上是生活随笔為你收集整理的libcurl使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91在线一区二区 | 亚洲精品自拍视频在线观看 | 久久 精品一区 | 伊人日日干 | 一级黄色片在线免费观看 | 91精品久久久久久综合乱菊 | 亚洲男男gaygay无套 | 在线岛国av | 国产精品国产亚洲精品看不卡 | 69国产精品成人在线播放 | 免费观看黄色12片一级视频 | 亚洲国产精品99久久久久久久久 | 久久这里只有精品视频首页 | 日日日日 | 久久只精品99品免费久23小说 | 欧洲av不卡 | 人人射网站| 五月婷久久| 黄色在线观看网站 | 亚洲国产精品小视频 | 国产亚洲激情视频在线 | 日韩精品免费一区二区三区 | 亚洲国产精品99久久久久久久久 | 亚洲成av片人久久久 | 91在线日韩 | 狠狠色噜噜狠狠狠合久 | 亚洲精品av中文字幕在线在线 | 在线免费试看 | 日本大尺码专区mv | 在线国产精品一区 | 欧美性生活小视频 | 天天射天天爱天天干 | 日韩精品久久久久久 | 9999在线 | 久久黄色片 | 欧美一级黄大片 | 麻豆91精品 | 久久精品一区二区三 | 午夜精品久久久久久久久久久久久久 | 亚洲一区二区三区毛片 | 三级午夜片 | 在线亚洲精品 | 99re亚洲国产精品 | av在线不卡观看 | 97精品国产97久久久久久久久久久久 | 中文字幕在线观看第二页 | www.天天成人国产电影 | 亚洲国产三级在线观看 | 亚洲精品va| 在线观看成人网 | 国产精品不卡在线观看 | 国产精品理论片在线播放 | 中文av一区二区 | 亚洲精品天天 | 国产精品久久视频 | 欧美夫妻生活视频 | 久久艹在线 | 99热精品视 | 色婷婷电影 | 天天干天天干天天干 | 亚洲电影黄色 | 日本中文字幕在线一区 | 91精品国自产在线观看欧美 | 色婷婷国产 | 国产精品破处视频 | 91精品视频在线免费观看 | 果冻av在线 | 国产操在线 | 久草在线视频国产 | 国产在线2020| 日韩婷婷| 亚洲激情六月 | av中文字幕网址 | 日韩欧美视频一区二区三区 | 国产精品一区二区av麻豆 | 国产精品福利在线 | 亚洲国产精品一区二区尤物区 | 激情久久久久久久久久久久久久久久 | 国产不卡在线视频 | 美女黄频 | 国产一级精品视频 | 亚洲精品视频一 | 91视频免费国产 | 超碰97人人干 | 91九色蝌蚪国产 | 在线观看a视频 | 中文字幕在线影视资源 | 四虎伊人 | 成人高清在线观看 | 中文字幕乱码电影 | 在线播放日韩av | 伊人首页 | 国产日产精品久久久久快鸭 | 亚洲精品视频免费在线 | 日韩一区二区三区在线看 | 国产手机在线播放 | 日日操夜| 在线观看视频你懂 | 日韩免费观看视频 | 久久久久电影网站 | 这里只有精彩视频 | 日韩欧美视频免费观看 | 韩国av在线 | 日韩专区在线播放 | 久久精品之 | 久久在线视频在线 | 日批视频在线观看免费 | 有码中文在线 | 99色国产 | 999在线精品 | 国产成人精品亚洲日本在线观看 | 国产在线专区 | 久久久91精品国产一区二区精品 | 99热9| 久久精品国产免费 | 国产精品国产三级在线专区 | 久久66热这里只有精品 | 日韩精品中文字幕在线不卡尤物 | 伊人成人久久 | 色偷偷中文字幕 | 超碰人人草 | 天天爱天天操天天爽 | 777视频在线观看 | 久久免费看a级毛毛片 | 欧美婷婷综合 | 一级欧美一级日韩 | 日韩aⅴ视频 | 国产精品av久久久久久无 | 国产精品情侣视频 | 特级毛片在线观看 | 亚洲国产欧洲综合997久久, | 日本精品中文字幕在线观看 | 97综合在线 | 92精品国产成人观看免费 | 在线观看国产成人av片 | 超薄丝袜一二三区 | 久久亚洲福利视频 | 久草在线91| 黄色app网站在线观看 | 国产va饥渴难耐女保洁员在线观看 | 亚欧日韩成人h片 | 久久久久这里只有精品 | 在线国产专区 | 亚洲色视频 | 麻豆首页| a级片久久久 | 中文字幕 国产专区 | 性日韩欧美在线视频 | 国产黑丝袜在线 | 免费av高清 | 免费91麻豆精品国产自产在线观看 | 日韩在线观看的 | 欧美不卡在线 | 狠狠干夜夜爽 | 99亚洲国产| 国产免费区| 色七七亚洲影院 | 日日夜夜精品免费视频 | 婷婷香蕉| 日韩肉感妇bbwbbwbbw | 国产亚洲欧洲 | 最新婷婷色 | 成全在线视频免费观看 | 免费欧美精品 | 99精品在线直播 | 久久成年人| 国产成人一区二区啪在线观看 | 99久久9| 久久久久美女 | 免费亚洲黄色 | 综合伊人av | 国产精品久久久久毛片大屁完整版 | 中文在线a∨在线 | 91亚·色| 水蜜桃亚洲一二三四在线 | 国产精品成人久久久 | 国产一二三四在线视频 | 国产免费激情久久 | 欧美激情综合五月色丁香 | 福利av影院 | 久久综合偷偷噜噜噜色 | 天天干天天天 | 999久久精品 | 美女久久久久久 | 久久99九九99精品 | 天天操婷婷 | 色www精品视频在线观看 | 欧美性网站 | 亚洲高清在线视频 | 在线播放 一区 | 国产日产精品一区二区三区四区 | 久久精品免费 | 久久免费精彩视频 | 99视频在线免费播放 | 亚洲精品麻豆 | 亚洲午夜精品在线观看 | 亚洲欧美日韩精品一区二区 | 麻豆视频成人 | 96av在线视频 | 黄色国产在线 | 亚洲黄色成人av | 天天做天天射 | 亚洲成人黄色在线 | 91亚洲网站| 五月天久久综合网 | 激情婷婷| 色播五月激情综合网 | 亚洲久草网 | 成人精品国产 | www日韩在线观看 | 欧美日韩不卡在线视频 | 免费高清在线一区 | 久免费 | 日韩精品久久中文字幕 | 四虎永久免费网站 | 欧美日韩一级久久久久久免费看 | 日本 在线 视频 中文 有码 | 一区二区三区www | 在线观看视频国产 | 奇米影音四色 | 久久久久久久久爱 | 国产99在线播放 | 激情婷婷综合网 | 亚洲第一成网站 | 日本精品二区 | 日韩综合精品 | 国产视频亚洲精品 | 国产视频精选 | 日韩中字在线观看 | 99精品在线 | 99精品视频精品精品视频 | 亚洲综合视频在线观看 | 久久人人97超碰精品888 | 日韩午夜大片 | av片子在线观看 | 久久久一本精品99久久精品 | a视频免费 | 久久99在线观看 | 成人在线你懂得 | va视频在线 | www.看片网站| 在线观看av不卡 | 色综合久久久久综合体桃花网 | 日韩极品视频在线观看 | 免费婷婷 | 亚洲国产精品推荐 | 国产色区 | 久久精品中文视频 | 97国产大学生情侣白嫩酒店 | 高清av网站 | 黄色软件在线观看 | 日本久久电影 | 国产免费xvideos视频入口 | 久久久久久久久久久久久久av | 人人超碰97| 深爱开心激情 | 欧美污污网站 | 一级一片免费视频 | 精品人人人人 | 欧美成人一区二区 | 久久天堂亚洲 | 国产精品va在线观看入 | 久久国产精品99久久久久久丝袜 | 九九视频在线播放 | 成人网在线免费视频 | 亚洲成人中文在线 | 国产99久久久精品视频 | 国产一区私人高清影院 | 国产裸体视频bbbbb | 高清不卡一区二区在线 | 免费一级片在线 | 成年人免费在线 | 亚洲手机天堂 | 在线91网 | 91伊人久久大香线蕉蜜芽人口 | 日韩特级黄色片 | 91看片在线观看 | 婷婷丁香六月天 | 成 人 黄 色 视频 免费观看 | 99久久精品国产一区二区三区 | 久久国内精品99久久6app | 精品视频中文字幕 | 欧美韩国日本在线 | 久久人人爽爽 | 91精品视频在线观看免费 | 免费观看性生交 | 黄色片网站大全 | 九九精品久久 | 精品国产自 | 男女拍拍免费视频 | 国产精品手机在线播放 | 欧美日韩高清在线一区 | 亚洲国产精品一区二区久久hs | 午夜精品福利一区二区 | 久久夜色精品国产欧美乱极品 | 国产99久久久精品 | 激情丁香5月 | 久久久亚洲网站 | 超碰97人人射妻 | 69精品久久 | 精品91在线| 在线观看视频中文字幕 | 国产精品入口久久 | 久久爱综合 | 日本深夜福利视频 | 成人av影视观看 | 亚洲一级片免费观看 | 天天噜天天色 | 碰超在线97人人 | 亚洲另类视频在线观看 | 一区二区三区在线播放 | 四虎影视成人永久免费观看视频 | 日韩视频一区二区三区在线播放免费观看 | 中文字幕一区二区三区在线视频 | 91成人看片| 亚洲黄色av网址 | 欧美精品亚洲精品日韩精品 | 玖玖在线观看视频 | 久久久精品二区 | 久久免费精品视频 | 中文成人字幕 | 免费在线黄色av | 国产精品一区二区精品视频免费看 | 日本久久久久久 | 二区精品视频 | 少妇bbbb揉bbbb日本 | 999视频网 | 在线观看视频黄色 | 久久精品视频网站 | 久久精品国产成人 | 99精品久久久久久久 | 日韩精品一区二区免费视频 | 91入口在线观看 | 91精品啪在线观看国产线免费 | 国产精品九九久久99视频 | 西西444www大胆无视频 | 91精品天码美女少妇 | 国产美女免费 | av在线h| 国产精品视频在线看 | 色a4yy| 成人中文字幕+乱码+中文字幕 | 欧美日韩一区二区三区在线观看视频 | 97av在线 | 久久久久中文字幕 | 久久久网页 | 国产在线国偷精品产拍免费yy | 欧美精品九九99久久 | 国内精品久久久久久久久久久久 | 在线电影 你懂得 | 国产精品久久久久久久午夜 | 中文字幕在线人 | 免费看黄在线网站 | 911免费视频 | 久久九九影视网 | 亚洲小视频在线观看 | 伊人天堂网| av免费网页 | 在线免费黄色片 | 国产成人精品三级 | 国产一二三区在线观看 | 91最新中文字幕 | 成人免费视频在线观看 | 99精品热视频只有精品10 | 色婷婷伊人 | 国产精品午夜在线观看 | 免费黄在线观看 | 国产最顶级的黄色片在线免费观看 | 中文久久精品 | 免费看短 | 日韩精品欧美一区 | 国产在线 一区二区三区 | 99热这里只有精品在线观看 | 国产视频亚洲视频 | 婷婷在线观看视频 | 国产高清久久 | 在线99视频| 日韩av一区二区三区 | 最近中文字幕高清字幕在线视频 | 99精品久久99久久久久 | 亚洲免费一级 | 激情久久婷婷 | 中文av网站 | 中文字幕中文字幕在线中文字幕三区 | 成年人免费看片网站 | 又黄又爽又刺激的视频 | 一区二区三区在线影院 | 色在线中文字幕 | 欧美a级在线 | 国产无遮挡猛进猛出免费软件 | 国内久久 | 久久久久久久久久久影视 | 久久黄页 | 国产自制av | 美女视频黄免费的 | 欧美性精品 | 在线亚洲成人 | 国产精品99久久99久久久二8 | 天天插天天| 亚洲爽爽网 | 久草热久草视频 | 国产精品美 | 91九色视频观看 | 日日夜夜综合网 | 一本一本久久a久久精品综合 | 久久亚洲免费视频 | 久久免费在线观看视频 | 中文字幕免 | 久久国产精品一区二区三区四区 | 国产精久久久久久久 | 黄色一级大片在线观看 | 久久精品久久久久久久 | 激情久久影院 | 国产精品嫩草影院99网站 | 天天综合网天天 | 九色琪琪久久综合网天天 | 开心色停停 | 91精品久久久久久久91蜜桃 | 亚洲精品国产精品国 | 久久五月婷婷丁香社区 | 亚洲永久精品在线观看 | 日韩精品一区二区三区视频播放 | 97超碰人人看 | 1024手机在线看 | 国产婷婷精品av在线 | 92av视频| 日韩欧美一区二区三区在线观看 | 国产视频亚洲精品 | 日韩在线首页 | 男女视频久久久 | 激情电影影院 | 亚洲欧美国产精品 | 天天看天天干 | 国产精品成人在线观看 | 黄色av一区二区 | 又黄又爽又无遮挡免费的网站 | 911香蕉| 国产成人福利在线观看 | 人人爽人人看 | 国产又粗又猛又色 | www五月婷婷 | 久久综合五月天婷婷伊人 | 五月婷婷毛片 | 手机成人免费视频 | 色综合激情网 | 亚洲 欧洲 国产 精品 | 九九视频精品在线 | 91黄色免费网站 | 国产在线观看xxx | 国产精品欧美久久久久三级 | 欧美精品久久久久久久免费 | 国产精品嫩草影院99网站 | 日韩黄色影院 | 夜色资源站wwwcom | 欧美精品在线观看免费 | 久久久久欧美精品 | 久久亚洲福利视频 | 在线观看国产区 | 蜜臀av.com | 欧美激情va永久在线播放 | 精品一区中文字幕 | 精品自拍sae8—视频 | 成人久久网 | 国产在线欧美在线 | 五月天亚洲婷婷 | 天天操天天摸天天爽 | 综合天堂av久久久久久久 | 久久视频网 | 精品国产黄色片 | 一区二区视频播放 | 国产成人精品电影久久久 | 国产另类av | 国产私拍在线 | 国产在线视频在线观看 | 最新极品jizzhd欧美 | 国产精品视频app | 精品视频免费看 | 久草综合在线观看 | 精品视频 | 国产精品久久久 | 久久免费观看视频 | 久久午夜网| 欧美另类xxxx | 一区二区三区高清在线观看 | 激情欧美在线观看 | 国产特级毛片aaaaaa高清 | 国产日韩高清在线 | 国际精品久久久 | 国产高清99 | 黄色小说在线观看视频 | 亚洲精品国产高清 | 久草免费在线观看视频 | 韩日精品中文字幕 | 久草视频免费在线播放 | 97色se | 久草影视在线 | 九九综合久久 | 欧美日韩在线视频一区 | 欧美精品一区在线 | 久久久精品免费观看 | 狠狠狠色丁香婷婷综合久久88 | 美女黄频在线观看 | 99视频播放| 最新国产精品亚洲 | 国产精品麻豆果冻传媒在线播放 | 在线精品视频在线观看高清 | 4438全国亚洲精品在线观看视频 | 超碰免费成人 | 欧美婷婷色 | 亚洲高清av在线 | 日韩一二三| 一区二区三区影院 | 奇米影视8888在线观看大全免费 | 亚洲精品成人网 | www.97色.com | 99视频国产在线 | av解说在线 | 一区 二区电影免费在线观看 | 欧美一级视频免费 | 色香com.| 91视频com | 成人小视频在线播放 | www.久久视频| 伊人色播| 久久久高清免费视频 | 国产成人精品999 | 久久久精品免费看 | 91pony九色丨交换 | 中文字幕在线观看你懂的 | 天天操夜夜操 | 国产色影院 | 久久视频 | 国产五月婷 | 午夜精品久久久久久久99热影院 | 亚洲无吗天堂 | 97福利在线 | 久久嗨| 综合久久影院 | 在线网址你懂得 | 亚洲精品免费在线观看 | www.香蕉视频在线观看 | 午夜三级福利 | 玖玖在线看| 国产精品高清免费在线观看 | 81精品国产乱码久久久久久 | 91在线视频精品 | 国产黄色精品在线 | 免费视频资源 | 香蕉视频在线网站 | 国产小视频在线观看免费 | 欧美性黑人 | 免费日p视频 | 久久精品中文字幕一区二区三区 | 日韩电影在线视频 | 手机在线中文字幕 | 狠狠色伊人亚洲综合网站野外 | 亚洲每日更新 | 日韩精品2区 | 天天拍夜夜拍 | 国产精品久久久久高潮 | 在线观看国产中文字幕 | 美女激情影院 | 亚洲国产影院av久久久久 | 成人免费影院 | 91精品欧美一区二区三区 | 日韩在线免费播放 | 综合久久网 | 黄色a视频免费 | 成人毛片网 | 久久99偷拍视频 | 黄色中文字幕在线 | 国产婷婷精品 | 国产福利不卡视频 | 久久久www | 久久国产一二区 | www.av小说| 九九久久久久久久久激情 | 亚洲伊人婷婷 | 在线成人一区二区 | 99 色 | 黄色免费大全 | 女人18片毛片90分钟 | 日本在线视频一区二区三区 | 久久久精品国产一区二区电影四季 | 日韩区欧美久久久无人区 | 99精品免费久久久久久久久 | 国产香蕉在线 | 色 中文字幕 | 久久久久国产一区二区三区四区 | 国产精品久久亚洲 | 国内精品中文字幕 | 亚洲精品一区二区三区四区高清 | 亚洲精品欧美视频 | 免费在线观看av的网站 | 国产成人免费观看 | 亚洲精品视频播放 | 国产精品国产自产拍高清av | 狠狠色婷婷丁香六月 | 天天曰天天| www.久久com| 夜夜躁狠狠躁 | 国产黄色大片 | 国产精品麻豆一区二区三区 | 91香蕉视频色版 | 欧美日韩在线视频免费 | 日三级在线| 日韩激情小视频 | 精品美女国产在线 | 在线精品视频免费播放 | 日韩网站在线免费观看 | 九色porny真实丨国产18 | 亚洲成人av片在线观看 | 成人性生交大片免费观看网站 | 精品国产乱码一区二区三区在线 | 亚洲专区在线 | 国产区网址 | 亚洲综合最新在线 | 色视频成人在线观看免 | 免费视频91蜜桃 | 免费黄色av片 | 国产不卡视频在线 | 青草草在线 | 黄色免费观看网址 | 久久久精品国产免费观看一区二区 | 天天爱av导航| 亚洲综合五月天 | 99热这里只有精品1 av中文字幕日韩 | 日韩欧美一区二区在线观看 | 91禁在线观看 | 一级黄色电影网站 | 亚洲一区二区三区在线看 | 亚洲欧美日韩不卡 | 亚洲成人xxx | 天天插视频 | 99久精品视频 | 国产精品99久久久精品 | 国产在线观看免费观看 | 天天色天天综合网 | a在线免费| 亚洲激情综合 | 久久九九免费视频 | 欧美污污视频 | 国产精品国产三级国产aⅴ入口 | 国产精品高潮久久av | 亚洲不卡在线 | 久草在线免费资源站 | av日韩不卡| 久久免费视频在线观看30 | 日本久久精品 | 麻豆久久久久 | 在线国产一区二区三区 | 午夜黄色一级片 | 国产欧美高清 | 黄色a视频免费 | 伊人久久国产精品 | 日韩在线色 | 天天干人人干 | 夜夜操狠狠操 | 丁香九月婷婷综合 | 久久大香线蕉app | 97超碰人人澡 | 欧美激情va永久在线播放 | 亚洲精品在线免费看 | 天天干com | 不卡的av电影在线观看 | 成人在线视频观看 | 精品国内自产拍在线观看视频 | www久久久久 | 婷婷六月在线 | 日韩精品视频免费在线观看 | 91黄色影视| 91大片成人网 | 国产自产高清不卡 | 国产成人三级在线观看 | 狠狠色综合网站久久久久久久 | 欧美午夜精品久久久久久孕妇 | 日韩系列在线观看 | 日韩狠狠操| 最近乱久中文字幕 | 亚洲免费视频在线观看 | 久久综合五月天 | 99在线视频播放 | 激情视频综合网 | 麻豆视频网址 | 日韩视频1区| 久久精品专区 | 亚洲狠狠干 | 青草视频在线看 | 国产高清一区二区 | 一级做a视频 | 久久久久久伊人 | 久久综合婷婷综合 | 视频在线在亚洲 | 欧美在线18 | av东方在线 | 人人干人人模 | 五月婷婷在线观看 | 在线看成人 | 免费观看91视频大全 | 一区二区精品国产 | 久久久精品午夜 | 在线成人短视频 | 在线天堂中文www视软件 | 亚洲三级国产 | 国产 色 | 国产精品久久久久久久久久久久久 | 久久久久亚洲国产精品 | 成人一区二区三区在线观看 | 91系列在线观看 | 久久成人在线视频 | 91精品视频一区 | 日韩中文字幕免费视频 | av在线网站免费观看 | 色网站在线看 | 制服丝袜在线 | 国产精品久久久久一区 | 成人资源在线播放 | 成人免费一级片 | 国产日韩视频在线观看 | 国产精品成人一区二区 | 亚洲一二三在线 | 亚州人成在线播放 | 在线成人一区 | 五月婷婷在线观看 | 久久成人免费 | 国产一区在线视频观看 | 国产99黄| 久久国产精彩视频 | 国产精品18p| 欧亚日韩精品一区二区在线 | 国产69久久精品成人看 | 午夜久久美女 | 国产成人亚洲在线电影 | 欧美激情视频一区二区三区 | 欧美日韩一区三区 | 开心婷婷色| av在线播放免费 | 91福利在线导航 | 亚洲综合色网站 | 视频精品一区二区三区 | 91中文字幕永久在线 | 亚洲美女在线一区 | 久久手机精品视频 | zzijzzij亚洲成熟少妇 | 狠狠色网 | 深夜福利视频一区二区 | 免费a级大片 | 国内小视频在线观看 | 九九九九九九精品任你躁 | 日韩美在线观看 | 欧美va日韩va | 手机av资源 | 亚州精品在线视频 | 成人av动漫在线 | 久久电影网站中文字幕 | 成人黄色一级视频 | 毛片网站观看 | 亚洲一级电影 | 亚洲天天在线日亚洲洲精 | 国产香蕉97碰碰碰视频在线观看 | 色综合在| 激情文学综合丁香 | 色婷婷激情四射 | 日韩精品一区二区三区免费观看视频 | 国产精品18久久久久久vr | 韩国一区在线 | 五月婷婷在线综合 | 又爽又黄又刺激的视频 | 99精品视频在线观看免费 | 色偷偷人人澡久久超碰69 | 国产亚洲精品无 | 美腿丝袜一区二区三区 | 91丨九色丨高潮丰满 | 中文字幕一区二区三区在线观看 | 中文字幕在线色 | 超碰97人人爱 | 在线观看视频中文字幕 | 亚洲专区在线播放 | 欧美激情va永久在线播放 | 日韩理论电影在线 | 欧美在线观看禁18 | 精品无人国产偷自产在线 | 青青久草在线视频 | 国产美女精品久久久 | 久久av观看| 91久久爱热色涩涩 | 69精品久久久 | 日韩午夜高清 | 国产精品女主播一区二区三区 | 国产亚洲精品久久久久久 | 日韩在线高清免费视频 | 最近日本中文字幕a | 国产精品黄色影片导航在线观看 | 超碰伊人网 | 成人三级网站在线观看 | 日本高清免费中文字幕 | 国产伦理一区二区三区 | 久久婷婷国产色一区二区三区 | 国产h在线播放 | 中文字幕网站 | 一区二区三区四区五区六区 | 91视频免费| 特级西西444www大胆高清无视频 | 91麻豆精品久久久久久 | 日韩欧美成人网 | 成人免费观看视频网站 | 永久免费观看视频 | 国产麻豆剧传媒免费观看 | 欧美另类z0zx | 国产高清不卡av | 成片人卡1卡2卡3手机免费看 | 久久草在线免费 | 91福利视频一区 | 亚洲欧美国产精品va在线观看 | 久久久免费精品视频 | 久久九九影视 | 欧美福利视频 | 久草免费资源 | 婷婷久久网站 | 国产黄色美女 | av在线影片| 久久精品在线免费观看 | 久久久免费 | 一区二区三区免费在线 | 五月天婷亚洲天综合网精品偷 | 在线观看91 | 国产天天综合 | 日本黄色片一区二区 | 欧美色图一区 | 国产精品一区二区免费视频 | 亚洲国产精品久久久久婷婷884 | 国产亚洲精品久久久久久久久久 | 亚洲一区日韩 | 亚洲欧洲中文日韩久久av乱码 | 中文字幕在线观看第三页 | 婷婷丁香久久五月婷婷 | 国产成人一区三区 | 偷拍福利视频一区二区三区 | 色亚洲网| a级国产乱理论片在线观看 伊人宗合网 | 综合在线色 | 五月激情综合婷婷 | 毛片www| 国产精品久久久久久久久久免费看 | 99久热在线精品视频 | 1024久久 | 夜夜婷婷| 欧美日韩视频精品 | 天天拍夜夜拍 | 麻豆久久 | 亚州精品在线视频 | 国产一二区视频 | 亚洲天堂网在线观看视频 | 中文字幕国产视频 | 波多野结衣在线观看视频 | 国产乱视频 | 国产91综合一区在线观看 | 亚洲精品久久久蜜臀下载官网 | 日本中文字幕系列 | 91大片网站| 国内精品久久久久 | 不卡中文字幕av | 日韩欧美高清在线观看 | 免费看色的网站 | 久久精品视频99 | 欧美国产日韩一区二区三区 | 久久久久久久久久电影 | 天天天综合网 | 极品嫩模被强到高潮呻吟91 | 五月天久久久久久 | 国产一级久久久 | 国产夫妻性生活自拍 | 婷婷色社区| 91福利在线观看 | 亚洲欧美在线观看视频 | 欧美孕妇与黑人孕交 | 中文字幕在线观看一区二区 | 黄色午夜 | 久久综合久久综合这里只有精品 | 久久久国产一区二区三区四区小说 | 亚洲欧美日本一区二区三区 | 成人黄色小视频 | www.伊人网| 欧美在线一 | 在线观看国产中文字幕 | 黄色影院在线播放 | 成年人免费看av | 日本中文字幕网址 | 青青河边草免费直播 | 成人禁用看黄a在线 | 成年人视频在线免费观看 | 亚洲高清激情 | 国产亚洲视频在线观看 | 99 久久久久| 中文字幕你懂的 | 久久精品一区二区三 | 日本韩国精品一区二区在线观看 | 区一区二区三区中文字幕 | 亚洲精品中文在线观看 | 欧美吞精 | 99一级片| 亚洲永久国产精品 | 91精品综合在线观看 | 18pao国产成视频永久免费 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 91成人黄色| 精品国产午夜 | 欧美日韩精品综合 | 99热这里只有精品久久 | 久久精品一二三区白丝高潮 | 亚洲精品免费在线观看 | 麻豆视频www | 色干干 | 国产一区视频在线 | 91精品国产91久久久久福利 | 大片网站久久 | 热re99久久精品国产99热 | 尤物97国产精品久久精品国产 | 97视频久久久 | 一区二区三区四区不卡 | 97国产精品 | 久草在线免费资源站 | 亚洲一区网站 | 亚洲成人家庭影院 | 久久久久久国产精品免费 | 色婷婷a | 激情综合网色播五月 | 在线免费观看黄色 | 天天综合狠狠精品 | 日韩欧美电影 | 久久不卡视频 | 天天天在线综合网 | 久久久99精品免费观看 | 国产美女免费看 | 中文字幕91在线 | 国产黄色片久久久 | 免费av小说 | 国产97碰免费视频 | 日韩精品短视频 | 最近中文国产在线视频 | 久久不卡视频 | 13日本xxxxxⅹxxx20 | 69av视频在线 | 日日婷婷夜日日天干 | 亚洲一级片 | 午夜精品一区二区三区四区 | 亚洲午夜精品久久久久久久久 | 中文字幕制服丝袜av久久 | 99热精品在线观看 | 91成人精品一区在线播放69 | 在线观看中文字幕 | 免费看片网站91 | 精品免费视频123区 午夜久久成人 | 精品国产一区二区久久 | 久久精品免费 | 亚洲人人射 | 99视 | 久久这里只有精品23 | 美女久久网站 | 视频一区二区视频 | 99综合电影在线视频 | 福利电影一区二区 | 久久99国产精品久久99 | 国产精品亚洲综合久久 | 成人免费看电影 | 久久久久久国产精品 | 精品一区二区在线免费观看 | 99久久精| 国产最新网站 | 99热在| 一本一本久久a久久精品牛牛影视 | 国内亚洲精品 | 综合激情| 91麻豆看国产在线紧急地址 | 菠萝菠萝在线精品视频 | 99久久精品国产一区二区三区 | 黄色av一区二区三区 | 国产精品久久久毛片 | 91.dizhi永久地址最新 | 国产黄网站在线观看 | 美女黄频在线观看 | 亚洲免费精彩视频 | 日韩成人欧美 | 午夜婷婷在线播放 | 福利视频 | 亚洲成人免费在线观看 | 亚洲国产午夜视频 | 狠狠色狠狠色合久久伊人 | 成年人黄色在线观看 | 91久久精品一区 | 在线观看免费av网站 | 成人av影视| 亚洲激情网站免费观看 | 五月婷婷在线观看 | 911精品视频 | av片一区| 久久久www成人免费精品 | 毛片黄色一级 |