每当打印来自CURL_WRITEFUNCTION的ptr时,奇怪的字符就会输出。

时间:2011-01-21 20:10:40

标签: c curl libcurl

我遇到了一些问题,这是我的代码(我正在使用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。这些字符是什么意思?我该如何删除它们?

1 个答案:

答案 0 :(得分:3)

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

  

应匹配的函数指针   以下原型:size_t函数(   void * ptr,size_t size,size_t nmemb,   void * 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;
}