【问题标题】:Weird Characters outputed whenever ptr from CURL_WRITEFUNCTION is printed.每当打印来自 CURL_WRITEFUNCTION 的 ptr 时,就会输出奇怪的字符。
【发布时间】:2011-01-21 20:10:40
【问题描述】:

我有点问题,这是我的代码(我使用的是 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。这些字符是什么意思?我怎样才能删除它们?

【问题讨论】:

  • 显而易见的原因是 *ptr 不是以空字符结尾的字符串,但我不确定为什么不:)
  • 那么我将如何摆脱这些角色?谢谢
  • @James,如果是 JSON 响应,您可以转到字符串的末尾,然后备份直到您点击 },但不能保证额外的几个未初始化字节不包含}
  • @Tim,是的,它是 JSON 响应。你能给我一个我可以使用的代码示例吗?谢谢
  • @James .. 那将是一个非常、非常丑陋的 hack ...

标签: c curl libcurl


【解决方案1】:

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

应该匹配的函数指针 以下原型: size_t 函数( void *ptr, size_t size, size_t nmemb, 无效*用户数据);这个函数得到 只要有 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;
}

【讨论】:

  • 嗨,我知道这个线程已经死了,但是我的代码在 //Increase payload size ret-&gt;payload = realloc(ret-&gt;payload,ret-&gt;size + realsize + 1); 你能想到崩溃的任何可能原因吗?
猜你喜欢
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2015-08-18
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多