libcurl 使用记录1(回调函数出错)

昨天使用libcurl api 进行url抓取,想分别获取header和body 存入字符串进行相应的处理。从官网的用例中找到了写文件、写struct的例子。改造之后发现回调过程中出core。

(1)CURLOPT_WRITEFUNCTION和CURLOPT_HEADERFUNCTION

使用过程中发现,仅实现CURLOPT_WRITEFUNCTION就可以获得header和body。

实现CURLOPT_HEADERFUNCTION仅能获得header本身。

(2)libcurl的回调函数是通过流(stream)的方式进行处理

        static size_t header_callback(void *ptr, size_t size, size_t nmemb, void *userdata)

查看回调函数的声明可以发现 它与fwrite的参数完全一致,所以猜想调用实现也应该一致,还没有看libcurl的源码,有时间可以看一下。

     size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

只要收到数据就会调用回调函数,不是接受完才处理,所以在使用过程中发现回调函数会被调用多次,比如接收到一行heade就会调用一次CURLOPT_HEADERFUNCTION的回调函数。(也可能不是一行,有时间看源码确定一下)调用libcurl的过程中会将本次接收的数据、数据长度、单个字符长度传递给回调函数。

在回调函数中可以对接收的数据进行处理,写到第四个参数userdata中。

(3)libcurl的回调函数的第四个参数

使用之前猜想libcurl本省应该给第四个函数开辟了内存,用户最后通过curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,body); 将数据拷贝从userdata拷贝到body中。

但在使用过程中发现,libcurl本省并不会对userdata进行什么处理(初始化内存),想多了,好像也没法这样做。它仅仅通过一些宏,实现了回调。而我们不可能在回调函数中对userdata的内存进行初始化,因为回调函数会调用多次,每次都初始化我们将无法获得全部数据。

那么这个usedata肯定是我们调用之前就已经被初始化的,对的,就是通过 调用curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,body)的时候, 将body的内存直接初始化给userdata。

刚开始没有调用curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,body) 导致core。

(4)错误记录

上面说了实现CURLOPT_WRITEFUNCTION就可以获得header和body。我在使用过程中开始只想获得header数据,于是定义如下

    curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA,header);

 curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION,writer_callback);

处理的过程中发现writer_callback 函数中第四个参数并没有分配内存。猜测应该是CURLOPT_WRITEFUNCTION 还是要通过curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,html); 初始化第四个函数(不知道设置了拿到header就停止任务是不是就可以了。。)。虽然它可以分别获得header和body。

添加

curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,html); 之后,程序正常。拿到了想要的html和header。

使用第三方api还是要多看example


你可能感兴趣的:(c++)