c語言libcurl庫的非同步用法

2021-07-23 15:39:14 字數 3496 閱讀 4853

原鏈結

multi介面的使用會比easy 介面稍微複雜點,畢竟multi介面是依賴easy介面的,首先粗略的講下其使用流程:curl_multi _init初始化乙個multi curl物件,為了同時進行多個curl的併發訪問,我們需要初始化多個easy curl物件,使用curl_easy_setopt進行相關設定,然後呼叫curl_multi _add_handle把easy curl物件新增到multi curl物件中,新增完畢後執行curl_multi_perform方法進行併發的訪問,訪問結束後curl_multi_remove_handle移除相關easy curl物件,curl_easy_cleanup清除easy curl物件,最後curl_multi_cleanup清除multi curl物件。

#include #include 

#include

#include

#include

using

namespace

std;

size_t curl_writer(

void *buffer, size_t size, size_t count, void *stream);/*

* * 生成乙個easy curl物件,進行一些簡單的設定操作 */

curl * curl_easy_handler(const std::string &surl,

const std::string &sproxy,

std::

string &srsp,

unsigned

intuitimeout)

if (!sproxy.empty())

//write function

//curl_easy_setopt(curl, curlopt_writefunction, curl_writer);

curl_easy_setopt(curl, curlopt_writedata, &srsp);

return

curl;}/*

* * 使用select函式監聽multi curl檔案描述符的狀態

* 監聽成功返回0,監聽失敗返回-1 */

int curl_multi_select(curlm *curl_m)

/*** 執行監聽,當檔案描述符狀態發生改變的時候返回

* 返回0,程式呼叫curl_multi_perform通知curl執行相應操作

* 返回-1,表示select錯誤

* 注意:即使select超時也需要返回0,具體可以去官網看文件說明

*/int ret_code = ::select(max_fd + 1, &fd_read, &fd_write, &fd_except, &timeout_tv);

switch

(ret_code)

return

ret;

}#define multi_curl_num 3

//這裡設定你需要訪問的url

//std::string url = "

";//這裡設定**ip和埠

//std::string proxy = "

ip:port";

//這裡設定超時時間

//unsigned int timeout = 2000; /*

ms *//**

* multi curl使用demo */

int curl_multi_demo(int

num)

curl_multi_add_handle(curl_m, curlarray[idx]);

}/** 呼叫curl_multi_perform函式執行curl請求

* url_multi_perform返回curlm_call_multi_perform時,表示需要繼續呼叫該函式直到返回值不是curlm_call_multi_perform為止

* running_handles變數返回正在處理的easy curl數量,running_handles為0表示當前沒有正在執行的curl請求

*/int

running_handles;

while (curlm_call_multi_perform == curl_multi_perform(curl_m, &running_handles))

/*** 為了避免迴圈呼叫curl_multi_perform產生的cpu持續占用的問題,採用select來監聽檔案描述符

*/while

(running_handles)

else

}cout

<< "

select:

"<< running_handles <

}//輸出執行結果

//int

msgs_left;

curlmsg *msg;

while((msg = curl_multi_info_read(curl_m, &msgs_left)))

if (idx ==num)

else}}

//這裡要注意cleanup的順序

//for (int idx = 0; idx < num; ++idx)

for (int idx = 0; idx < num; ++idx)

curl_multi_cleanup(curl_m);

return0;

}/** * easy curl使用demo */

int curl_easy_demo(int

num)

return0;

}#define use_multi_curl

struct

timeval begin_tv, end_tv;

int main(int argc, char *argv)

int num = atoi(argv[1

]);

//獲取開始時間

// gettimeofday(&begin_tv, null);

#ifdef use_multi_curl

//使用multi介面進行訪問

//curl_multi_demo(num);

#else

//使用easy介面進行訪問

//curl_easy_demo(num);

#endif

//獲取結束時間

//struct

timeval end_tv;

gettimeofday(&end_tv, null);

//計算執行延時並輸出,用於比較

//int eclapsed = (end_tv.tv_sec - begin_tv.tv_sec) * 1000 +(end_tv.tv_usec - begin_tv.tv_usec) / 1000

; cout

<< "

eclapsed time:

"<< eclapsed << "ms"

<

return0;

}

用libCURL庫post json資料

libcurl是優秀的c語言版http 庫,時間比較久,目前支援也比較完善,官方網頁見 對很多協議都有很好的支援。別的語言都有對http較完善的庫支援,在c c 領域libcurl可能是最好用的了吧。我本來是打算用qt裡面的qnetworkmanager,無奈實在是太難用,這一點qt做的實在不怎麼的...

C語言LIBCURL庫使用注意事項

這裡乙個j a程式設計師進行c 開發使用libcurl踩過的坑 1.傳送指定請求型別body,比較通用方法如下,可以直接填寫資料並手動指定content type,如果是form表單等形式,則需要參考curl formadd方法 2.響應結果包含了響應行和頭域資訊 curl easy setopt ...

使用C 網路庫libcurl

curl global init 和curl global cleanup 這兩個函式並不是執行緒安全的。所以只能在主線程中進行一次的初始化和清除。解決辦法 設定超時 curl easy setopt curl,curlopt timeout,30l 自 libcurl 是乙個很不錯的庫,支援htt...