curl_global_cleanup();
此处重要的两个参数是 CURLOPT_WRITEDATA
与 CURLOPT_WRITEFUNCTION
。
使用 CURLOPT_WRITEFUNCTION
设置自定义 callback。使用 CURLOPT_WRITEDATA
设置的指针成为 callback 的第四个参数。
在这个程序中,我们的 callback 只是简单的调用 fwrite()
将数据写入文件。实际上你可能已经发现,recv_cb()
的函数签名与 fwrite()
是一样的(除了指针类型,但这对于 callback 不重要)。也就是说,在此例中,可以直接将 fwrite()
作为 CURLOPT_WRITEFUNCTION
的参数。
Warning
callback 的返回值是重要的。需要是 size_t
类型,而且应当等于 size * nmemb
。否则,libcurl 将认为写数据时发生错误,curl_easy_perform()
调用将返回 CURLE_WRITE_ERROR
。(libcurl 保证 size
永远等于 1。)
如果你正在 C++ 中使用 libcurl,请注意在设置 callback 时不能使用 Lambda 表达式与仿函数。即使你的 Lambda 不捕获任何变量,也需要先转换到函数指针。否则在执行 curl_easy_perform()
时程序会崩溃。
实际上,在这个例子中,也可以完全不设置 callback。还记得我们说过,如果没有额外设置,会将数据输出到 stdout
吗?也就是说,默认的 callback 就是 fwrite()
,而默认的第四个参数也就是 stdout
(自己试试输出它的地址)。如果不设置自定义 callback,那么这时候 CURLOPT_WRITEDATA
就必须是一个 FILE *
指针。此时 libcurl 表现得如同用 fwrite()
将数据写到你提供的 FILE *
中。