libcurl库使用详情、libcurl库的制作
文章目錄
- libcurl庫的制作
- 1.libcurl簡介:
- 2.下載libcurl庫并制作自己的curl庫
- 3.API說明
- 相關(guān)例子見官網(wǎng):[example.html](https://curl.se/libcurl/c/example.html)
- 4.libcurl庫函數(shù)介紹:
- 1.curl_global_init(long flags)
- 2 curl_easy_init
- 3 curl_easy_setopt
- 4.curl_easy_perform執(zhí)行一個curl會話
- 5.curl_easy_cleanup
- 6. curl_global_cleanup
libcurl庫的制作
1.libcurl簡介:
? libcurl是一個跨平臺的網(wǎng)絡(luò)協(xié)議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協(xié)議。libcurl同樣支持HTTPS證書授權(quán),HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認(rèn)證。libcurl的官網(wǎng) 、庫下載。這種庫使用的時候就像使用wiringPi庫一樣,編寫完代碼需要鏈接這個庫,所以要先下載這個庫。
libcurl的使用(其實和socket編程時一樣,都需要一定的步驟):
- 調(diào)用curl_global_init()初始化libcurl,(就像初始化套接字)
- 調(diào)用curl_easy_init()函數(shù)得到 easy interface型指針(這個指針用來各種配置)
- 調(diào)用curl_easy_setopt()設(shè)置傳輸選項(通過調(diào)用curl_easy_setopt這個函數(shù)來對指針進(jìn)行各種配置,比如:請求的方式)
- 根據(jù)curl_easy_setopt()設(shè)置的傳輸選項,實現(xiàn)回調(diào)函數(shù)以完成用戶特定任務(wù)
- 調(diào)用curl_easy_perform()函數(shù)進(jìn)行訪問請求
- 調(diào)用curl_easy_cleanup()釋放內(nèi)存
2.下載libcurl庫并制作自己的curl庫
https://github.com/curl/curl/releases
1.解壓 -C表示解壓位置
sudo tar -zxvf curl-7.83.1.tar.gz -C /usr/local2.進(jìn)入/usr/local/curl-7.83.1
cd /usr/local/curl-7.83.13.生成_install文件
使用./configure configure的目的是和windows一樣進(jìn)行指定文件安裝在什么路徑上面
–with-ssl :支持https
./configure --prefix=$PWD/_install --with-ssl4.make make install
make make install5.進(jìn)入_install目錄
cd _install/6.將include文件夾和lib文件夾拷貝出來放在一個目錄中
編譯時,調(diào)用動態(tài)庫
gcc test.c -o main -I ./include/curl -L ./lib -lcurl參考:動態(tài)庫靜態(tài)庫制作
示例:獲取網(wǎng)址傳回的數(shù)據(jù)
test.c
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> #include "curl/curl.h" //#include "cJSON.h" // size_t 是一些C/C++標(biāo)準(zhǔn)在stddef.h中定義的,size_t 類型表示C中任何對象所能達(dá)到的最大長度,它是無符號整數(shù)。//網(wǎng)站傳回的數(shù)據(jù) size_t MyCallBack(char* p, size_t size, size_t nmemb, void* userdata) { char* buf = malloc(size* nmemb);memcpy(buf,p,size*nmemb);// cJSON* root = cJSON_Parse(buf);// if(root == NULL)// {// printf("NULL\n");// return 0;// }// char *s = cJSON_Print(root);printf("%s\n",buf);free(buf); } int main(int argc, char const *argv[]) {char data[32]="hello";curl_global_init(CURL_GLOBAL_ALL);CURL* curl = curl_easy_init();//設(shè)置URLcurl_easy_setopt(curl,CURLOPT_URL,"http://www.baidu.com");//設(shè)置協(xié)議頭struct curl_slist *plist = curl_slist_append(NULL,"Content-Type:application/json");curl_easy_setopt(curl,CURLOPT_HTTPHEADER,plist);//設(shè)置post的回調(diào)函數(shù)curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,MyCallBack);//設(shè)置傳輸?shù)臄?shù)據(jù)curl_easy_setopt(curl,CURLOPT_POST,1);curl_easy_setopt(curl,CURLOPT_POSTFIELDS,data);//執(zhí)行 curl_easy_perform(curl);//關(guān)閉 curl_easy_cleanup(curl);return 0; }編譯運行
gcc test.c -I ./include -L ./lib -lcurl ./a.out3.API說明
libcurl – C API
相關(guān)例子見官網(wǎng):example.html
4.libcurl庫函數(shù)介紹:
1.curl_global_init(long flags)
功能:初始化libcurl
這個函數(shù)只能用一次。(其實在調(diào)用curl_global_cleanup 函數(shù)后仍然可再用)
如果這個函數(shù)在curl_easy_init函數(shù)調(diào)用時還沒調(diào)用,它將由libcurl庫自動調(diào)用
所以多線程下最好主動調(diào)用該函數(shù)以防止在線程中curl_easy_init時多次調(diào)用。
注意:雖然libcurl是線程安全的,但curl_global_init是不能保證線程安全的,所以不要在每個線程中都調(diào)用curl_global_init,應(yīng)該將該函數(shù)的調(diào)用放在主線程中。
參數(shù):flags
CURL_GLOBAL_ALL //初始化所有的可能的調(diào)用。 CURL_GLOBAL_SSL //初始化支持 安全套接字層。 CURL_GLOBAL_WIN32 //初始化win32套接字庫。 CURL_GLOBAL_NOTHING //沒有額外的初始化。2 curl_easy_init
初始化一個curl會話
CURL *curl_easy_init( );描述:curl_easy_init用來初始化一個CURL的指針(curl的所有操作就是圍繞該指針進(jìn)行). 相應(yīng)的在調(diào)用結(jié)束時要用curl_easy_cleanup函數(shù)清理.
注意:一般curl_easy_init意味著一個會話的開始. 它會返回一個easy_handle(CURL*對象), 一般都用在easy系列的函數(shù)中。
3 curl_easy_setopt
為curl調(diào)用設(shè)置一個選項
//設(shè)置請求的url【這是唯一要求必須設(shè)置的選項,不然咋知道是向誰請求或發(fā)送數(shù)據(jù)】 // Even if you set a crazy value here, curl_easy_setopt will still return CURLE_OK. // 該url相當(dāng)于瀏覽器輸入的地址,如果可以帶文件,執(zhí)行后就可以下載文件 curl_easy_setopt(curl_handler, CURLOPT_URL, url);//設(shè)置是否返回請求頭 // 設(shè)置的值為1,意味要返回請求頭;0表示不返回。無其他值 curl_easy_setopt(curl_handler, CURLOPT_HEADER, 1L);//設(shè)置屏蔽其他信號 curl_easy_setopt(curl_handler, CURLOPT_NOSIGNAL, 1L);//設(shè)置下載數(shù)據(jù)回調(diào)函數(shù) // 若置為NULL,則其默認(rèn)值為fwrite /* 回調(diào)函數(shù)原型:size_t function( void *ptr, size_t size, size_t nmemb, void *userp);函數(shù)將在libcurl接收到數(shù)據(jù)后被調(diào)用。void *ptr是下載回來的數(shù)據(jù).void *userp是用戶指針, 用戶通過這個指針傳輸自己的數(shù)據(jù). CURLOPT_WRITEDATA:設(shè)置回調(diào)函數(shù)中的void *userp指針的來源。 */ curl_easy_setopt(curl_handler, CURLOPT_WRITEFUNCTION, write_func); // 如果設(shè)置這個值,則必須懟個CURLOPT_WRITEFUNCTION,否則會崩潰 // If you're using libcurl as a win32 DLL, you MUST use a CURLOPT_WRITEFUNCTION if you set this option or you will experience crashes. curl_easy_setopt(curl_handler, CURLOPT_WRITEDATA, write_data);//設(shè)置是否使用下載進(jìn)度控制函數(shù) // 為0,表示把下載進(jìn)度顯示在控制臺;為1,表示不顯示下載進(jìn)度 curl_easy_setopt(curl_handler, CURLOPT_NOPROGRESS, 0L); curl_easy_setopt(curl_handler, CURLOPT_PROGRESSFUNCTION, prog_func); curl_easy_setopt(curl_handler, CURLOPT_PROGRESSDATA, pdata); // 下載進(jìn)度回調(diào)函數(shù)與下載數(shù)據(jù)的回調(diào)函數(shù)原型相同,data也相同。//設(shè)置請求頭 struct curl_list *header_list = NULL; header_list = curl_slist_append(header_list, headers);curl_easy_setopt(curl_handler, CURLOPT_HTTPHEADER, header_list); curl_slist_free_all(header_list);//其他選項CURLOPT_HEADERFUNCTION // 只取HTTP頭部數(shù)據(jù), 處理與下載數(shù)據(jù)回調(diào)的處理相同. CURLOPT_HEADERDATA // 超時時間CURLOPT_TIMEOUT // 連接等待時間.CURLOPT_CONNECTIONTIMEOUT // 設(shè)置支持302重定向CURLOPT_FOLLOWLOCATION // 斷點續(xù)傳, 指定傳輸分片, 格式:"0-200" CURLOPT_RANGE描述:該函數(shù)可以設(shè)置訪問url的屬性,具體設(shè)置可看libcurl官網(wǎng)介紹:https://curl.haxx.se/libcurl/c/
注:如果設(shè)置Post方式發(fā)送數(shù)據(jù),則需要設(shè)置 CURLOPT_POSTFIELDS和CURLOPT_POSTFIELDSIZE
PS:若需要復(fù)制該設(shè)置的屬性,調(diào)用curl_easy_duphandle.若需要清空之前設(shè)置的屬性,可以調(diào)用curl_easy_reset
4.curl_easy_perform執(zhí)行一個curl會話
CURLcode curl_easy_perform(CURL *handler);描述:執(zhí)行當(dāng)次請求創(chuàng)建的句柄,在curl_easy_setopt完成后調(diào)用,執(zhí)行我們設(shè)置的option。返回值可以從官網(wǎng)中獲取意義:https://curl.haxx.se/libcurl/c/libcurl-errors.html
5.curl_easy_cleanup
void curl_easy_cleanup(CURL *handler);//關(guān)閉一個curl會話,用來結(jié)束一個會話.與curl_easy_init配合著用.6. curl_global_cleanup
void curl_global_cleanup();libcurl是線程安全的,但curl_global_cleanup是不能保證線程安全的。因此需在主線程調(diào)用該函數(shù),而不是在每個線程中調(diào)用。
參考:
https://www.cnblogs.com/xietianjiao/p/13260021.html
https://blog.csdn.net/byxdaz/article/details/81869881
總結(jié)
以上是生活随笔為你收集整理的libcurl库使用详情、libcurl库的制作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI人体引力报警系统,人体感应报警系统,
- 下一篇: 什么是哈希码?它的作用是什么?