libcurl easy接口

322 阅读1分钟
size_t writeDataCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    // 当有数据被接收的时候,就会调用该函数
    // 函数会被多次调用,每次都会收到一段数据

    // contents指向收到的数据,size总是1,nmemb是数据的大小
    // contents不会以0结尾
    size_t real_size = size * nmemb;

    auto* out_stream = (std::stringstream*) userp;

    (*out_stream) << std::string((char*) contents, real_size);

    // 必须返回实际的字节数,如果和传递进来的数值不同,会终止libcurl,并且curl_easy_perform的返回值将会是CURLE_READ_ERROR
    return real_size;
}

int main(int argc, char* args[]) {

    curl_global_init(CURL_GLOBAL_ALL);

    CURL* handle = curl_easy_init();

    std::stringstream stream;

    curl_easy_setopt(handle, CURLOPT_URL, "http://45.76.133.64");
    // 所有接收到的数据都会发送给该函数
    // 如果传入nullptr,会调用内部默认的回调函数,该回调函数会写数据到CURLOPT_WRITEDATA提供的FILE*参数
    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeDataCallback);
    // 通过CURLOPT_WRITEDATA设置writeDataCallback的userp选项
    curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void*) &stream);
    curl_easy_setopt(handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    // 执行请求,并且返回CURLcode状态码
    // 该接口是阻塞的
    CURLcode code = curl_easy_perform(handle);

    // clean up handle
    curl_easy_cleanup(handle);

    // clean up libcurl
    curl_global_cleanup();

    std::cout << stream.str() << std::endl;

    return 0;
}