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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

libcurl教程

發布時間:2025/5/22 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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) {// 初始化libcurlCURLcode return_code;return_code = curl_global_init(CURL_GLOBAL_WIN32);if (CURLE_OK != return_code){cerr << "init libcurl failed." << endl;return -1;}// 獲取easy handleCURL *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) {// 初始化libcurlCURLcode 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 handleCURL *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);// 單個域postcurl_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 postcurl_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 handleeasy_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 stackcurl_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); }

總結

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

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

99热999| 国产在线中文字幕 | 蜜臀av性久久久久蜜臀av | 亚洲丁香久久久 | 国产精品免费小视频 | 色福利网 | 精品国产一区二区三区蜜臀 | 中文字幕网址 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产亚洲资源 | 欧美日韩伦理一区 | 国产一区二区不卡视频 | 国产亚洲日本 | 国产精品mv在线观看 | 日本三级在线观看中文字 | 久久黄色影视 | 久久亚洲精品电影 | 麻豆视频免费观看 | 手机av在线网站 | 亚洲精品va | 久久久久国产精品午夜一区 | 狠狠色综合网站久久久久久久 | 一本—道久久a久久精品蜜桃 | 欧美日韩精品免费观看 | 成人羞羞视频在线观看免费 | 国产我不卡 | 日本亚洲国产 | 国产精品美女久久久久久久网站 | 99中文视频在线 | 99久久国产免费看 | 综合色爱 | 偷拍福利视频一区二区三区 | 一区二区av| 久久久精品欧美一区二区免费 | 国产日韩精品一区二区三区 | 久久九九国产视频 | 国产精品一区二区三区在线播放 | av免费网站观看 | 美女久久久久 | 国产黄a三级三级三级三级三级 | 国产一区二区在线视频观看 | www天天操 | 综合在线色| 麻豆91精品视频 | 久久天天躁狠狠躁夜夜不卡公司 | 久9在线 | 麻豆首页 | 成人91av | 国产国语在线 | 网站免费黄色 | 日韩黄色大片在线观看 | 一区二区不卡视频在线观看 | 色福利网| 在线看国产日韩 | 久草手机视频 | 欧美日韩视频在线 | 亚洲视频在线播放 | 久久精品视频免费 | 国产在线观看污片 | 亚洲美女在线一区 | 欧美激情综合五月色丁香小说 | 91网在线观看 | 一级黄色片在线免费观看 | 精品五月天 | 久久久久人人 | 精品国产免费观看 | 午夜精品福利一区二区三区蜜桃 | 久草在线视频首页 | 2021国产视频 | 99久久精品日本一区二区免费 | 欧美色图另类 | 黄色官网在线观看 | 日本超碰在线 | 国产在线日本 | 国产视频在线观看一区 | 嫩小bbbb摸bbb摸bbb | 播五月婷婷 | 狠狠色丁香 | 成人中文字幕在线观看 | 日本视频网 | 91九色成人蝌蚪首页 | 天天干天天操av | 99久久久久久国产精品 | 黄色软件在线观看 | 免费国产在线视频 | 国产高清在线观看av | 欧美日韩啪啪 | wwwav视频| 久草资源免费 | 成人午夜在线电影 | 色综合久久久久综合99 | 久草在线最新 | 日韩精品电影在线播放 | 中文字幕一区在线 | 在线看岛国av| 亚洲婷婷伊人 | 婷婷国产一区二区三区 | 黄色aaaaa| 成人久久综合 | 成人影片在线免费观看 | 91成人破解版 | 久久天天躁夜夜躁狠狠躁2022 | 91香蕉视频在线下载 | 日韩一区二区在线免费观看 | 成人小电影在线看 | 视频一区二区三区视频 | 国产精品一区二区免费在线观看 | 久久久久草 | 久久只精品99品免费久23小说 | 国产精品大片在线观看 | 超碰97av在线 | 制服丝袜亚洲 | 操久在线| 亚洲成av人影片在线观看 | 国产日韩在线一区 | 91精品一区二区三区蜜桃 | 天天操比| 91免费在线 | 日韩电影在线观看一区二区三区 | 久久午夜精品影院一区 | 国内精品美女在线观看 | 久久久久久久国产精品 | 久久99精品久久久久久三级 | 国产精品一区二区中文字幕 | 国产成人99av超碰超爽 | 久草在线视频在线观看 | 日韩,中文字幕 | 人人草在线观看 | 激情av一区二区 | 中文字幕在线观 | 国产精品理论片在线观看 | 中文字幕一区二区三 | 午夜视频在线观看一区 | 国产精品久久久久久久久久 | 三级av片| 免费日韩av片 | 黄av免费在线观看 | 97精品视频在线播放 | 中文字幕在线观看视频一区 | 国产999精品久久久久久 | 1024手机基地在线观看 | 国产一区免费在线 | 黄色91在线| 天天摸天天操天天爽 | 亚洲精品美女在线观看播放 | 国产一二区视频 | 成人av电影网址 | 免费观看一级特黄欧美大片 | 黄色成人小视频 | 精品福利国产 | 中文字幕免费高清在线观看 | 国产尤物在线视频 | 18国产精品白浆在线观看免费 | 亚洲高清精品在线 | 国产又粗又猛又色又黄视频 | 成人国产精品一区二区 | 免费高清国产 | 国产 色 | 黄色成人影视 | 精品久久久久久久久久久院品网 | 黄色免费网战 | 国产成人一级 | 国产精品一区二区久久精品爱涩 | 国产香蕉久久精品综合网 | 日本电影久久 | 久久婷婷丁香 | 欧美亚洲国产精品久久高清浪潮 | 免费黄色网址大全 | 日韩久久视频 | 国产一区二区手机在线观看 | 天天干,夜夜爽 | 免费高清在线观看电视网站 | 91视频91自拍 | 有码中文在线 | 久久色亚洲| 国产精品自产拍在线观看中文 | 欧亚日韩精品一区二区在线 | 久久男人中文字幕资源站 | 成人亚洲综合 | 不卡的av在线 | 在线播放亚洲激情 | 免费视频xnxx com | 色婷婷狠狠五月综合天色拍 | 色播五月激情综合网 | 在线观看不卡的av | 最新国产在线 | 日日爱网站 | 国产精品激情 | av三级在线免费观看 | 人人dvd| 天天av天天 | 婷婷四房综合激情五月 | 久久久69 | a视频在线看 | 黄色一级免费电影 | 欧美日韩中文在线 | 又黄又爽又刺激 | 99热精品国产一区二区在线观看 | 久久久久久久综合色一本 | 日韩激情一二三区 | 婷婷综合导航 | 亚洲男男gaygay无套同网址 | 国内精品视频一区二区三区八戒 | 亚洲国内在线 | 色综合久久久久综合体 | 在线观看黄色av | 国产免费午夜 | 日本久久中文 | 日韩中文字幕免费看 | 亚洲视频在线播放 | 成人av久久| 久草97| 婷婷色社区 | 精品国产一区二区在线 | 午夜视频在线观看一区 | 超碰公开在线 | 国产午夜麻豆影院在线观看 | 成人一区二区在线 | 深爱激情五月婷婷 | 久久成人18免费网站 | 黄色大片入口 | www.操.com| 99在线精品视频观看 | 日韩中文字幕电影 | 久久视频这里有久久精品视频11 | 亚洲欧美经典 | 免费看的av片 | 在线视频亚洲 | 在线三级av | 插婷婷 | 四虎在线观看精品视频 | 亚洲女同videos| 天天操婷婷| 午夜国产在线观看 | 日韩 在线 | 综合在线观看色 | 国产精品黄色影片导航在线观看 | 色噜噜在线观看视频 | 伊人影院在线观看 | 91精品成人| av 一区二区三区四区 | 91精品国产三级a在线观看 | 国产精品男女 | 永久精品视频 | 久久er99热精品一区二区三区 | 欧美电影在线观看 | ww亚洲ww亚在线观看 | 亚洲激情视频在线观看 | 狠狠躁夜夜躁人人爽视频 | 久久高清 | 欧美日韩一区二区在线 | 国产成人精品999 | 国产精品岛国久久久久久久久红粉 | 欧美性一级观看 | 成人午夜性影院 | 黄色毛片大全 | 欧美一区二区视频97 | 久久综合精品国产一区二区三区 | 久久99这里只有精品 | 国产精品免费视频观看 | 韩国一区二区在线观看 | 久久免费毛片 | 久 久久影院 | 欧美伦理电影一区二区 | 色婷婷国产 | 精品美女视频 | 在线v片| 国产99久久久精品 | 精品国产成人在线 | 久久精品视频网 | 日本久久高清视频 | 黄色在线观看www | 久久婷亚洲五月一区天天躁 | 黄污视频网站大全 | 亚洲va综合va国产va中文 | 中文字幕 在线看 | 亚洲精品国产电影 | 国产麻豆精品在线观看 | 顶级欧美色妇4khd | 午夜视频播放 | 亚洲欧洲精品一区二区精品久久久 | 97伊人网| 欧美日韩免费在线视频 | 精品美女久久久久 | 国产一级在线播放 | 丝袜美腿一区 | 日韩黄色一级电影 | 久久国产午夜精品理论片最新版本 | 伊人伊成久久人综合网站 | 色播五月激情综合网 | 久久99亚洲精品久久 | 国产午夜麻豆影院在线观看 | 在线观看网站你懂的 | 黄色免费看片网站 | 日日爱av | 在线国产福利 | 日韩高清在线一区二区三区 | 日日夜夜噜噜噜 | 伊人影院在线观看 | 日韩免费看视频 | 中文字幕在线观看一区二区三区 | 丁香六月综合网 | 欧美日韩国产精品一区 | 中文字幕91在线 | 成片人卡1卡2卡3手机免费看 | 97超碰在线人人 | 91亚洲在线 | 狠狠网站 | 999视频网 | 国产精品自在线拍国产 | 99视频在线精品 | 欧美日韩国产免费视频 | 免费在线看成人av | 日本精品久久久久 | 亚洲一级免费观看 | 久久久久在线视频 | 午夜av在线 | 精品 激情 | 日韩成人黄色 | 99久久精品免费看 | 久久色亚洲 | 久草久草在线 | 久草电影免费在线观看 | 天天操夜夜摸 | 二区三区在线视频 | 六月婷婷网 | 国产九色视频在线观看 | 91九色最新| 国产精品入口传媒 | 欧美一级黄大片 | 在线免费黄色av | 中文字幕在线久一本久 | 国产精品手机在线 | 久久草在线精品 | 久久激情视频 久久 | 99国产视频在线 | 国产美女免费视频 | 国产日韩视频在线观看 | 狠狠狠干 | 黄污在线观看 | av一本久道久久波多野结衣 | 奇米影视在线99精品 | 欧美在线观看视频一区二区三区 | 日日夜夜天天射 | 中文字幕在线观看免费观看 | 久久 在线| 国产精品视频你懂的 | 在线一级片 | 欧美色888 | 久久免费视频国产 | 久久久毛片 | 国产精品国产亚洲精品看不卡15 | av一二三区 | 国产资源网 | 国产97在线观看 | 欧美福利在线播放 | 久久毛片网站 | 日韩最新av在线 | 欧美一级片免费观看 | 亚洲天堂网视频在线观看 | 中文字幕在线免费观看 | 精品福利网 | 欧美 激情在线 | 成年人视频在线观看免费 | 深爱开心激情 | 91漂亮少妇露脸在线播放 | www.一区二区三区 | av中文字幕剧情 | 4p变态网欧美系列 | 99se视频在线观看 | 亚洲综合国产精品 | 国产中文视频 | 国产精品久久久久久久久免费看 | av解说在线 | 97在线视频网站 | 天天综合亚洲 | 免费在线观看国产黄 | 久久这里只有精品久久 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 国产一区在线播放 | 热99在线视频 | 天天综合中文 | 欧美日本中文字幕 | 亚洲,播放| 九九视频免费 | 日韩色高清 | 久久久官网 | 婷婷色 亚洲 | 99久久久免费视频 | 五月天久久久久 | 中文字幕国产一区二区 | 久久黄色成人 | 欧美日韩高清在线观看 | 成人午夜av电影 | 天天摸日日摸人人看 | 久久 精品一区 | 国产视频在线免费 | 在线播放亚洲 | 国产护士hd高朝护士1 | 视频在线播放国产 | 亚洲精品中文字幕在线 | 天天射网站 | 精品福利在线 | 国产精品一区二区 91 | av电影免费在线看 | 成人黄色电影在线 | 国产123av| 在线观看国产永久免费视频 | 精品麻豆入口免费 | 久久久国产精品久久久 | 久久午夜免费视频 | 7777xxxx| 国产精品久久久久久久av大片 | 免费观看性生交 | 啪啪肉肉污av国网站 | 伊人午夜视频 | 奇米影视8888在线观看大全免费 | 国产成人精品久 | 99国产一区二区三精品乱码 | 不卡日韩av | 激情www| 精品一区二区在线看 | 亚洲国产成人精品久久 | 国产精品久久久久9999吃药 | 婷婷丁香在线 | 日日夜夜天天久久 | 国产成人黄色在线 | 久久免费美女视频 | 日韩午夜av| 亚洲久草网 | 日日干干 | 啪啪av在线 | 亚洲二区精品 | 免费看色的网站 | 亚洲狠狠婷婷综合久久久 | 特黄色大片 | 国产视频在线播放 | 国产精品久久久久久久av大片 | 久久久国产精品电影 | 中文字幕有码在线 | 免费看污在线观看 | 99久久国产免费看 | 一级黄色免费 | 色的网站在线观看 | 精品专区一区二区 | 天天操天天干天天爱 | 欧美乱熟臀69xxxxxx | 国产麻豆视频在线观看 | 日韩va欧美va亚洲va久久 | 国产精品亚洲视频 | 丁香六月婷婷开心 | 国产成人一级电影 | 玖玖玖在线| 久久免费毛片视频 | 成人动漫一区二区 | 亚洲天堂免费视频 | 2019av在线视频 | 久久国产精品网站 | 久久久国产精品电影 | 欧美日韩国产一二三区 | 久久久久成人精品免费播放动漫 | 国产69久久久欧美一级 | 在线观看一 | 波多野结衣精品在线 | 日本黄色大片免费 | 午夜久久久精品 | 久久avav | 国产尤物在线视频 | 免费网址你懂的 | 亚洲高清国产视频 | 四虎影院在线观看av | 亚洲精品久久激情国产片 | 中文字幕av全部资源www中文字幕在线观看 | 成人av高清| 国产视频一| 欧美日韩一区二区在线观看 | 中文字幕亚洲情99在线 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 久久久久久免费网 | 亚洲精品国产精品国自产观看浪潮 | 夜夜骑日日 | 成人久久毛片 | 99久久国产免费,99久久国产免费大片 | 欧美成年人在线观看 | 久久久久久高潮国产精品视 | 国产精品免费视频网站 | 六月丁香婷婷网 | 日韩欧美视频免费看 | 成人av一区二区兰花在线播放 | 精品视频久久久 | 久久国产视频网 | 91成人网在线播放 | 国产午夜精品一区二区三区在线观看 | 国产成人在线免费观看 | 中文乱码视频在线观看 | 精品视频一区在线 | 一区二区三区四区五区六区 | 久久xxxx| 91av久久 | 丁香视频在线观看 | 中文字幕 第二区 | 日日日天天天 | 丁香六月婷婷 | 黄色片免费在线 | 天天干人人干 | 久久国产亚洲视频 | 亚洲精品久久久久999中文字幕 | 成人av网站在线观看 | 亚洲激精日韩激精欧美精品 | 欧美日韩观看 | 免费福利视频网站 | 久久99精品久久只有精品 | 免费看污网站 | 国产精品欧美日韩 | av网址aaa| 国产精品欧美在线 | 黄色av一级片 | 在线国产视频一区 | 中文字幕在线观看91 | 欧美精品久久久久性色 | 久久夜色精品国产欧美乱极品 | av在线播放中文字幕 | 欧美一级性生活片 | 高清日韩一区二区 | 日本中文字幕免费观看 | 亚洲精品欧美专区 | 美女一二三区 | 国产精品婷婷午夜在线观看 | 五月天久久久久久 | 五月天综合色激情 | 亚洲人成在线电影 | 亚洲欧美视频网站 | 在线观看日韩国产 | 亚洲日本va在线观看 | 亚洲午夜av | 国产精品video爽爽爽爽 | www国产亚洲精品久久网站 | 午夜影院在线观看18 | 国产男女无遮挡猛进猛出在线观看 | 91香蕉视频在线下载 | 五月花丁香婷婷 | 亚洲激情电影在线 | 精品国产久 | 国产精品一区二区三区四 | 五月婷丁香 | 青青河边草观看完整版高清 | 日韩精品 在线视频 | 久久国产精品免费一区 | 欧美伦理一区二区三区 | 亚洲国产偷 | 91禁看片| 中日韩欧美精彩视频 | 久久免费视频这里只有精品 | 日韩理论在线观看 | 免费日韩视 | 爱干视频 | 免费看网站在线 | 伊人网站| 国产亚洲精品免费 | 久久五月精品 | 久草视频首页 | 伊人影院在线观看 | 日韩精品一区二区在线观看 | 日韩欧美一区二区三区黑寡妇 | 亚洲经典在线 | 午夜婷婷在线观看 | www.久艹 | 亚州五月| 日日夜夜艹| 亚洲专区视频在线观看 | 国产美女网 | 超级碰碰碰视频 | 麻豆系列在线观看 | 免费色视频在线 | 毛片区 | 91av电影 | 美腿丝袜一区二区三区 | 欧美 日韩 国产 成人 在线 | 日韩欧美一区二区三区在线 | 精品亚洲一区二区 | 亚洲精品乱码久久久久v最新版 | 国产日韩欧美在线免费观看 | 欧美精品三级 | 97超碰精品 | 91在线看片 | 天天射天天射天天 | 亚洲免费在线视频 | 亚洲激情视频在线观看 | 久久国产精品视频 | 中文字幕一区二区三区在线观看 | www视频在线免费观看 | 日韩精品视 | 色婷婷激情综合 | 国产一线在线 | 国产精品 久久 | 久草在线99 | www.狠狠操.com | 成人亚洲综合 | 91精品入口| 亚洲国产成人在线观看 | 中文字幕视频免费观看 | av免费在线播放 | 麻豆视频大全 | 一级精品视频在线观看宜春院 | 97超碰色 | 97在线观看免费高清 | av观看网站 | 亚洲春色综合另类校园电影 | 国模视频一区二区 | 久久99国产精品久久99 | 一区 二区电影免费在线观看 | 久久涩涩网站 | 高清久久久 | 中文字幕日本电影 | 欧洲精品视频一区 | 日韩女同一区二区三区在线观看 | 国产免费一区二区三区网站免费 | 亚洲电影久久久 | 亚洲欧美激情插 | 亚洲精品免费观看 | 成人在线观看免费视频 | 伊人日日干 | www日日| 91丨九色丨首页 | 欧美日韩二区三区 | 国产成人精品在线 | 中文字幕一区二区三区精华液 | 国产精品99久久久久的智能播放 | 亚洲影视资源 | 99re热精品视频 | 六月婷婷色| 亚洲精品黄 | 亚洲国产人午在线一二区 | 亚洲精品资源 | 欧洲在线免费视频 | 色资源网免费观看视频 | 国产精品久久久久久久妇 | 色久av | 日日干 天天干 | 亚洲年轻女教师毛茸茸 | 一级成人免费 | 日韩电影中文字幕在线观看 | 在线观看视频精品 | 久久精品久久久久 | 中文一区二区三区在线观看 | 噜噜色官网 | 日本在线观看黄色 | 亚洲精品国产精品乱码不99热 | 波多野结衣亚洲一区二区 | 久久精品一二三区白丝高潮 | 91久久偷偷做嫩草影院 | 97在线观看免费观看 | 欧美在线视频一区二区 | 四虎成人免费观看 | 午夜12点| 国产亚洲精品女人久久久久久 | 97超碰.com | 狠狠狠狠狠狠狠狠干 | 最近日本中文字幕 | 美州a亚洲一视本频v色道 | 17婷婷久久www | 91精品国产成| 97在线看片| av 一区二区三区 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 久久久久国产精品一区 | 午夜久久久久久久久久影院 | 五月综合| 色综合激情久久 | 久99久视频 | 黄色免费av | 在线视频精品 | 日韩av成人在线观看 | 久久99影院 | 美女免费网站 | 成人在线免费观看网站 | 国产中文字幕久久 | 色九九影院 | 久草网视频 | 国产视频日韩视频欧美视频 | 激情欧美丁香 | 99国产精品久久久久老师 | 国产成人一区二区三区在线观看 | 欧美久久久久久久久久久 | 黄av在线| 91桃色免费视频 | 黄色免费观看视频 | 91探花在线视频 | 国产在线视频导航 | 久久久久久国产精品久久 | 精品国产一区二区三区久久久久久 | www.久久免费视频 | 成人a毛片| 四虎影视www | 一区免费视频 | 国产精品毛片久久久久久久 | 日日久视频 | 最新成人av| 黄色一区三区 | 亚洲精品视频中文字幕 | 国产视频在线观看一区 | 在线成人中文字幕 | 毛片888| 日韩精品久久久久久久电影99爱 | 亚洲欧洲成人 | 天天综合狠狠精品 | 国产系列在线观看 | 免费看精品久久片 | 午夜视频亚洲 | 亚洲成aⅴ人片久久青草影院 | www免费网站在线观看 | 97人人超 | 日日夜夜骑 | 欧美一区免费观看 | 欧美日韩精品国产 | 超碰国产人人 | 超黄视频网站 | 在线视频区 | 日韩久久一区 | 美女久久一区 | 亚洲国产精品电影 | 在线之家免费在线观看电影 | 99久久久久久久久久 | 在线精品亚洲一区二区 | 日韩久久精品一区二区三区下载 | 中文字幕视频三区 | 国产裸体视频bbbbb | 91精彩视频 | 亚洲国产网站 | 久久av伊人 | 999男人的天堂 | 狠狠干成人 | 亚洲有 在线 | 欧美日韩国产精品一区二区三区 | av一本久道久久波多野结衣 | 久久综合久久综合这里只有精品 | 天天av在线播放 | 国内成人av| 亚洲va欧美va | 国产成人免费高清 | 国产999精品久久久久久麻豆 | 国产不卡视频在线 | 四虎成人免费影院 | 久久久久国产成人免费精品免费 | 色婷婷成人网 | 久草在线费播放视频 | 99久久精品电影 | 国产精品美女久久久久久久久久久 | 中文一区在线观看 | 中字幕视频在线永久在线观看免费 | 日韩网站一区 | 成人cosplay福利网站 | 久久爱资源网 | 亚洲成a人片77777kkkk1在线观看 | 色综合久久中文字幕综合网 | 精品久久久成人 | 国内精品久久久久久久久久清纯 | 人人操日日干 | 日本在线中文 | 中文字幕日韩伦理 | 91看片一区二区三区 | 亚洲 欧洲 国产 日本 综合 | www.福利视频 | 国产在线观看地址 | 久久99久久精品 | 国产成人专区 | 极品中文字幕 | 美女黄久久 | 国产一区二区三区网站 | 蜜臀av夜夜澡人人爽人人 | 日韩激情精品 | 国产中文字幕视频在线观看 | 日韩国产精品一区 | av色图天堂网 | 亚洲成av人电影 | 日韩在线观看网站 | 操操碰 | 色婷婷六月天 | 亚洲人xxx | 久久国产精品视频观看 | 国偷自产视频一区二区久 | 亚洲激情六月 | 久久精品99国产精品亚洲最刺激 | 亚洲精品黄 | 日韩欧美视频在线播放 | 丁香六月综合网 | 国产精品一区二区在线看 | 免费观看特级毛片 | 深爱激情婷婷网 | 日韩精品在线观看视频 | 91精品视频一区二区三区 | 91麻豆免费看 | 99视频精品全部免费 在线 | 青青草国产免费 | 成人wwwxxx视频| 亚洲精品合集 | 99精品国产兔费观看久久99 | 国产精品18久久久久久不卡孕妇 | 天天爽天天摸 | 久久久国产精品一区二区三区 | 69视频在线 | 国产成人一区二区三区在线观看 | 中文字幕在线一区二区三区 | av片子在线观看 | 中文字幕在线免费看 | 激情欧美一区二区三区免费看 | 少妇资源站 | 精品在线观看国产 | 黄色在线免费观看网站 | 欧美精品一区二区三区一线天视频 | 国产91aaa| 麻豆视频一区 | 亚洲综合在线五月天 | 天天操天 | 中文字幕视频一区 | 久久视频| 五月婷婷,六月丁香 | 人人爽人人 | 亚洲综合在线视频 | 亚州精品在线视频 | 超碰av免费 | 国产精品一区二区三区四区在线观看 | 国产精品99久久久久久武松影视 | 久久久久久久久国产 | 久久亚洲免费 | 91在线影视 | 久久国产精品免费视频 | 丁香六月婷婷开心 | 久久公开免费视频 | 香蕉成人在线视频 | 97人人超碰在线 | 久久久 精品 | 婷婷丁香激情综合 | 久久精品人人做人人综合老师 | 在线免费高清一区二区三区 | 91黄色在线看 | 激情视频区 | 天天色天天操综合网 | 国产成人三级在线 | 日韩影视在线 | 99视频黄 | 欧美亚洲成人免费 | 婷婷五月在线视频 | 亚洲 欧洲 国产 日本 综合 | 久久精品xxx | 成年人在线播放视频 | 免费在线观看av网址 | 97在线免费观看视频 | 狠狠躁日日躁夜夜躁av | 欧美视屏一区二区 | а天堂中文最新一区二区三区 | 美女精品久久久 | 日韩电影中文字幕在线观看 | 国产中文在线播放 | 国产日韩在线看 | av中文字幕在线播放 | 日日日网| 欧美一级免费片 | 婷婷中文在线 | 天天爽夜夜爽人人爽曰av | 天天色天天射天天操 | 天天摸天天舔天天操 | 国产在线播放观看 | 久久亚洲区 | 色五月成人 | 免费一级日韩欧美性大片 | 全久久久久久久久久久电影 | 久久久久亚洲精品国产 | 五月天丁香 | 美女精品 | 欧美片一区二区三区 | 国产日韩精品在线 | 日本一区二区不卡高清 | 精品国产99国产精品 | 亚洲高清久久久 | 91九色精品女同系列 | 久久久久久久久久久久久久电影 | 婷婷六月丁 | 国产中文字幕视频在线观看 | 亚洲精品www | 国产大尺度视频 | 91精品久久香蕉国产线看观看 | 狠狠躁夜夜躁人人爽超碰91 | 欧美精彩视频在线观看 | 在线观看av免费 | 国产伦理久久 | 免费无遮挡动漫网站 | 国语自产偷拍精品视频偷 | 亚洲一区二区麻豆 | 911国产精品 | 97偷拍视频 | 97成人在线免费视频 | 999视频网| 亚洲精品综合一区二区 | 久一网站 | 色www免费视频 | 久久精品99国产精品 | 在线免费国产 | 午夜精品久久久久久久久久 | 开心激情婷婷 | 综合在线色 | 天天操夜夜逼 | 亚洲午夜久久久综合37日本 | 色婷婷激情四射 | 在线播放视频一区 | 亚洲精品在线视频播放 | 亚洲人人精品 | 99精品视频精品精品视频 | 成人av片免费观看app下载 | 亚洲一区二区视频 | 国产系列 在线观看 | 国产精品一区二区精品视频免费看 | 91精品国产欧美一区二区 | 欧美国产日韩在线视频 | 免费视频 你懂的 | 91福利视频免费 | 中国一级特黄毛片大片久久 | 国产精品毛片一区二区 | 成人资源在线观看 | av一级片网站| 国产麻豆视频网站 | 韩日成人av | 日韩免费在线视频 | 欧美性大胆| 91人人爽人人爽人人精88v | 97在线观看视频免费 | 四虎www com | 日韩无在线 | 国内久久久久久 | 96av视频 | 亚洲尺码电影av久久 | 日韩一区二区三区高清免费看看 | 视频一区在线免费观看 | 久久9精品| 亚洲专区欧美专区 | 欧美激情综合五月 | 99c视频在线| 国内综合精品午夜久久资源 | 日日爱网址 | 在线观看国产区 | 国产乱对白刺激视频在线观看女王 | 亚洲婷婷网 | 99视频精品全国免费 | 亚洲视频1 | 深爱激情站 | 九九日韩 | 日韩精品视频一二三 | 婷婷色影院| 日本女人的性生活视频 | 精品一区二区免费在线观看 | 中文字幕视频 | 日韩一区在线播放 | 中文字幕 国产专区 | av在线a| 亚洲精品1234区 | 麻豆视频免费在线 | 国产看片免费 | 免费观看高清 | 亚洲在线视频播放 | 中文字幕在线播放视频 | 97网| 激情影音先锋 | 久久呀 | 天天爱天天操天天射 | 午夜精品久久久久久久久久久 | 97在线观看 | 久久精品电影 | 人人爽人人 | 色九九影院 | 中文字幕电影一区 | 亚洲综合在线五月 | 操操操日日日干干干 | 天天爽天天碰狠狠添 | 这里有精品在线视频 | 日韩理论 | 超级碰碰碰视频 | 国产99久久久精品 | 久久综合偷偷噜噜噜色 | 免费在线观看毛片网站 | 久久精品电影 | 在线亚洲天堂网 | 91完整版观看 | 日韩丝袜视频 | 日韩高清无线码2023 | 欧美日韩不卡一区二区三区 | 国产精品大片免费观看 | 精品一区 在线 | 日韩 国产| 97视频精品| av在线激情| 久久成人18免费网站 | 色综合久久久久网 | 天天综合视频在线观看 | 久久国产精品99国产精 | 99久久爱 | 午夜精品一区二区国产 | 91精品啪在线观看国产81旧版 | 91在线视频免费观看 |