原鏈結
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...