【问题标题】:libcurl WriteMemoryCallback method don't work on iOSlibcurl WriteMemoryCallback 方法在 iOS 上不起作用
【发布时间】:2015-12-07 07:54:24
【问题描述】:

我使用 libcurl 从我的服务器请求数据。但是 WriteMemoryCallback 方法无法成功运行。 我的操作系统是iOS,libcurl的版本是7.40.0。 这些是我的代码:

struct ResultStruct {
    char *memory;
    char *cookie_list;
    char *session_id;
};

struct MemoryStruct {
    char *memory;
    size_t size;
};

static size_t WriteMemoryCallback(char *contents, size_t size, size_t nmemb, struct MemoryStruct *userp)
{
    size_t realsize = size * nmemb;
    userp->memory = contents;
    if(userp->memory == NULL) {
        /* out of memory! */
        printf("not enough memory (realloc returned NULL)\n");
        return 0;
    }
    return realsize;
}

curl_slist * get_cookies(CURL *curl)
{
    CURLcode res;
    struct curl_slist *cookies;
    printf("Cookies, curl knows:\n");
    res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
    if (res != CURLE_OK) {
        fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res));
        exit(1);
    }
    return cookies;
}

char *get_comment(char *url)
{
    CURL *curl;
    CURLcode res;
    struct MemoryStruct *chunk = new struct MemoryStruct;
    chunk->memory = new char[2000];
    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, chunk);
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
        curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
        res = curl_easy_perform(curl);
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        curl_easy_cleanup(curl);
    }
//    curl_global_cleanup();
    std::cout << "------------------------------------------" << std::endl;
    std::cout << chunk->memory << std::endl;
    char *result = new char[2000];
    result = chunk->memory;
//    delete chunk->memory;
    delete chunk;
    std::cout << "******************************************" << std::endl;
    std::cout << result << std::endl;
    std::cout << "------------------------------------------" << std::endl;
    return result;
}

我在方法WriteMemoryCallback中设置了一个断点,我发现param内容包含我需要的数据。但是我在get_comment方法中设置了断点,发现param块丢失了一些数据。我不知道如何修复错误。我没有找到错误。我需要帮助。

【问题讨论】:

  • 我不太确定在 iOS 上使用 libcurl 有什么意义。你为什么不使用NSURLSession(或者NSURLConnection,如果你需要兼容iOS

标签: ios libcurl


【解决方案1】:

我强烈建议您在 iOS 上使用 NSURLSession 而不是 libcurl

但是,这里的问题是,当 libcurl 接收数据时,WriteMemoryCallback 被多次调用。您应该汇总从这些多次调用中收到的数据,但您没有,您只需将 userp-&gt;memory 设置为指向 contents (这是一个坏主意,因为您至少应该复制它, contents 不保证回调返回后仍包含相关数据)。

你需要分配内存并将新收到的数据追加到WriteMemoryCallback中。

或使用NSURLSessiondataTaskWithURL:completionHandler 将为您完成所有这些工作。

【讨论】:

  • 你是对的。我通过程序修改并使用 string.append(char *) 来获取响应数据。它工作了。
  • 如果这个答案没有针对另一个没有被要求的框架的离题建议,我会支持它......
  • 嘿@DanielStenberg,不要误会我的意思,我喜欢 curl 并且几乎每天都使用它,当我需要在 perl 中进行网络请求时,我肯定会使用 WWW::Curl,但在 iOS 上我真的不觉得对于大多数用例有很多理由偏离标准系统框架......
  • 没关系,我一点也不介意,只是发现根本不是问的问题。
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多