日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

libcurl库使用详情、libcurl库的制作

發布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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/local

2.進入/usr/local/curl-7.83.1

cd /usr/local/curl-7.83.1

3.生成_install文件

使用./configure configure的目的是和windows一樣進行指定文件安裝在什么路徑上面

–with-ssl :支持https

./configure --prefix=$PWD/_install --with-ssl

4.make make install

make make install

5.進入_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.out

3.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库的制作的全部內容,希望文章能夠幫你解決所遇到的問題。

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