【发布时间】: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