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