我有一个问题,这是我的代码(我正在使用C):

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <json/json.h>

size_t callback_func(void *ptr, size_t size, size_t count, void *stream) {
//json_object *json_obj = json_tokener_parse(ptr);
printf ("%s",(char*)ptr);

return count;

}

int main(void)
{
      CURL *curl;
          CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?track=http");
    curl_easy_setopt(curl, CURLOPT_USERPWD, "Firrus:password");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_func);
    curl_easy_perform(curl);



    /* always cleanup */
    curl_easy_cleanup(curl);


  }

  return 0;
}


问题在于,每次打印ptr时,顶部也会输出三个奇怪的(看似随机的)字符,例如77D或6DA。这些字符是什么意思?如何删除它们?

最佳答案

根据文档,回调函数以这种方式工作:


应该与
以下原型:size_t函数(
无效* ptr,size_t大小,size_t nmemb,
无效* userdata);该功能得到
一旦有libcurl调用
收到的数据需要保存。
ptr指向的数据大小
将大小乘以nmemb,它将
不被零终止。返回
实际处理的字节数
的。如果该金额与
传递给您的函数的金额
向库发出错误信号。这个
将中止转移并返回
CURLE_WRITE_ERROR。
从7.18.0开始,该函数可以返回
CURL_WRITEFUNC_PAUSE,然后它将
导致写入此连接
变得停顿了。见curl_easy_pause(3)
有关更多详细信息。

该函数可以用零来调用
字节数据(如果传输的文件是
空的。

.....

使用设置userdata参数
CURLOPT_WRITEDATA选项。

回调函数将被传递
尽可能多的数据
调用,但是您可能无法进行
任何假设。可能是一个字节,
可能是数千。最大值
可以传递给的数据量
写回调是在
curl.h头文件:
CURL_MAX_WRITE_SIZE。


因此,您的回调可以被调用多次。
您需要将数据存储到自己的结构中,该结构将跟踪到目前为止已读取的数据。

试试这个解决方案:

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    size_t size;
    char *payload;
}srvresponse;

size_t callback_func(void *ptr, size_t size, size_t count, void *stream) {
    //printf("%s", (char*) ptr);

    size_t realsize = size * count;
    printf("Chuncksize:%lu\n",realsize);
    srvresponse *ret = (srvresponse*)stream;
    //Increase the payload size
    ret->payload = realloc(ret->payload,ret->size + realsize + 1);
    //Copy the new data
    memcpy(&(ret->payload[ret->size]),ptr,realsize);
    //Update the size
    ret->size += realsize;
    //Terminate the string
    ret->payload[ret->size] = 0;
    printf("Read so far:%s",ret->payload);
    return realsize;

}

int main(void) {
    CURL *curl;

    srvresponse retdata;
    retdata.payload = malloc(1);//We increase the capacity later
    retdata.size = 0;

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?track=http");
        curl_easy_setopt(curl, CURLOPT_USERPWD, "user:pass");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_func);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&retdata);
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        curl_global_cleanup();


        if (retdata.payload){
            puts(retdata.payload);
            free(retdata.payload);
        }
    }

    return 0;
}

10-07 19:16
查看更多