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