C++11 Async cURL
来源:互联网 发布:h网络是什么意思 编辑:程序博客网 时间:2024/06/05 11:12
https://gist.github.com/owickstrom/3218376
#include <iostream>#include <curl/curl.h>#include <math.h>#include <vector>#include <future>#include <boost/format.hpp>#define logbase(a, b) (log(a)/log(b))using namespace std;using boost::format;const char *fileSizes[] = {"byte", "K", "MB", "GB", "TB"};const int numFileSizes = 5;// adds chunk size to sumsize_t addChunkSize(char *ptr, size_t size, size_t nmemb, void *data){ auto acc = (long *)data; auto chunkSize = size * nmemb; *acc += chunkSize; return chunkSize;}// returns a formatted string (number of bytes, K, MB, GB or TB)string getSizeString(long fsize){ int fmtIndex; format fmter; if(fsize == 0 || (fmtIndex = (int)floor(logbase(fsize, 1024))) == 0) { fmter = format("%ld %s") % fsize % fileSizes[0]; } else { fmtIndex = (fmtIndex >= numFileSizes) ? numFileSizes : fmtIndex; fmter = format("%.2f %s") % (fsize / pow(1024, fmtIndex)) % fileSizes[fmtIndex]; } return fmter.str();}void usage(string name){ cout << "Usage: " << name << " url1 url2 url3 ...\n";}int main(int argc, const char * argv[]){ long acc = 0L; auto results = vector<future<long>>(); // if no urls if(argc == 1) { usage(string(argv[0])); exit(1); } for(int i = 1; i < argc; i++) { const char *url = argv[i]; // create future using a lambda and push it to the result vector results.push_back(async(launch::async, [url]() -> long { CURL *curl; CURLcode res; long siteSize = 0; curl = curl_easy_init(); if(curl) { // setup curl_easy_setopt(curl, CURLOPT_URL, url); // pass the siteSize pointer along (received by addChunkSize) curl_easy_setopt(curl, CURLOPT_WRITEDATA, &siteSize); // callback for downloaded chunks curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, addChunkSize); // make the request res = curl_easy_perform(curl); // something failed if(res != CURLE_OK) { cerr << "\rWebsite size fetch failed for " << url << ": " << curl_easy_strerror(res) << "\n"; siteSize = 0; } // successful else { cerr << "\rSize of " << url << ": " << getSizeString(siteSize) << "\n"; } // cleanup curl_easy_cleanup(curl); } return siteSize; })); } // gather results from futures for(auto &result : results) { acc += result.get(); } cerr << "\nTotal size of websites: " << getSizeString(acc) << "\n"; return 0;}
0 0
- C++11 Async cURL
- [c#]: async and await
- 【C#】49. async, await 基础
- curl c api
- c语言 curl
- c语言 curl
- 【C++】CURL环境搭建
- c语言 curl
- C/C++使用Curl
- c语言 curl
- curl (c - url)
- c++11 async
- Async
- async
- Async
- async
- async
- async
- 前端工程师面试题总结 - Coding(1)
- 展示glfw回调函数,鼠标 键盘 窗口等等,输入输出都齐了
- how to convert a object to json file immediately during debug?
- 最小正子串问题
- 最长回文子串
- C++11 Async cURL
- 辛星浅谈大型网站构架优化思路之一简化
- Leetcode: Same Tree
- python 笔记
- 辛星浅谈大型网站架构思路之二分解
- 代码面试题:Subtree
- linux下的超级服务器inetd
- 基于std::string的字符串处理
- Clone Graph