我正在使用libcurl来执行HTTP请求和对我的网页的响应。 但是在获得响应时,我没有得到完整的服务器响应。响应行在某一点被截断。例如
10-25 15:53:22.264: XXX(14847): Security.8021x:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInput:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInput.Notification.HTTP.CGI:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInput.Notification.HTTP.CGI.SingleSession:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInpu .............
注意:这是一个自定义的Android日志。请不要与输出线混淆
响应中还有大约10行,但是我的当前日志显示在“Event.AlarmInpu”之后没有输出。
当我提供curl命令行选项
时curl http://www.google.com > output.txt
我可以在文件中找到完整的输出行。
当我使用curl命令行工具并将响应移动到输出文件时,我可以看到整个响应数据。所以我同意curl命令正在检索整个响应。 我得到了整个响应,但是响应比我的缓冲区长度长,因此它被截断了。
请告诉我如何增加缓冲区长度以获得完整的响应线 代码段如下所示
typedef struct pageInfo_t {
char *data;
int len;
} pageInfo_t;
static size_t HTTPData(void *buffer, size_t size, size_t nmemb, void *userData)
{
int len = size * nmemb;
pageInfo_t *page = (pageInfo_t *)userData;
page->data = realloc(page->data,page->len + len +1);
memcpy(&page->data[page->len], buffer, len);
page->len += len;
page->data[page->len] = 0;
return len;
}
//Inteface funciton that will recieve web page fom Java
jstring Java_com_samsung_jnitest_MainActivity_JNIGetWebpage( JNIEnv* env,jobject entryObject,jstring webpageJStr)
{
pageInfo_t page;
CURL *curl;
CURLcode res;
char *buffer;
int memorysize = 19189;
page.data = (char *)malloc(16 * memorysize);
page.len = 0;
if (page.data)
memset(page.data, 32, 16 * memorysize);
buffer = (char *)malloc(memorysize);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, webpage);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
(*env)->ReleaseStringUTFChars(env, webpageJStr, webpage);
if(response_code == 200)
{
if (buffer)
{
page.data[page.len] = '\0';
sprintf(buffer, "%ld:%s \n", response_code, page.data);
return (*env)->NewStringUTF(env, buffer);
}
}
}
}
请告诉我如何增加缓冲区大小以保留完整的响应行 如果我过度使代码复杂化,请告诉我
答案 0 :(得分:0)
您将buffer
分配为memorysize
(19189
字节)。
但是,page.data
指向的缓冲区会根据HTTP请求返回的数据量而增长。但是,无论page.data
是否足够大,您都会将buffer
指向的空终止字符串复制到buffer
。
也许您应该摆脱与buffer
相关的所有代码并退出您的函数,例如:
jstring retval = (*env)->NewStringUTF(env, page.data);
free(page.data);
return retval;
在response_code != 200
。
其他一些评论:
webpage
是如何设置或声明的 - 我假设您的真实代码中有GetStringUTFChars()
被忽略的电话?jstring
结果。答案 1 :(得分:0)
我遇到了同样的问题,并且通过扩展CURLOPT_TIMEOUT_MS为我解决了该问题。