我有一个问题,这是我的代码(我正在使用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;
}