我使用C中的libcurl获取目录中的文件列表:
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_URL, path);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, data);
res = curl_easy_perform(curl);
在回调中,我正在分析输出并处理文件:
static size_t my_fwrite(void * buffer, size_t size, size_t nmemb, void * root)
{
ftp_user_data * data = (ftp_user_data *)root;
char * rec = bxi_malloc(size * nmemb + 1);
bxi_memcpy(rec, buffer, size * nmemb);
printf("### %u (%u*%u)\n", (u32)(size*nmemb), (u32)size, (u32)nmemb);
lines_process(rec, data);
bxi_free(rec);
return size * nmemb;
}
但我有个问题。如果目录足够大,则返回的答案是分块的:
### 2865 (1*2865)
##
drwxr-xr-x 2 film tk 4096 Jun 6 10:03 .
drwxr-xr-x 114 film tk 53248 Jun 21 19:02 ..
-rw-r--r-- 4 film tk 19944333271 Jun 6 04:01 00f94595-a72c-44d7-8d7a-990c04a96f90
-rw-r--r-- 3 film tk 3439134 Jun 6 01:01 049307a7-b335-4981-a77c-735628473343
-rw-r--r-- 4 film tk 138285646 Jun 6 01:20 075a6aa4-8eab-43cc-9262-04f19ce11c6a
<...>
-rw-r--r-- 4 film tk 2712631246 Jun 6 00:41 61043b6f-6897-499a-8ca3-8c3d2401af10
-rw-r--r-- 4 film tk 2459646286 Jun 6 01:14 6afd69e4-b098-453a-ae4f-790e3f08fff0
-rw-r--r-- 4 film tk 2401778628 Jun 6 01:17 75ade815-1138-4db7-b096-49f945996e8f
-rw-r--r-- 4 film tk 32681128626 Jun 6 03:47 77fa0b2e-7188-4b05-9cd0-db054282885b
-rw-r--r-- 4 film tk 6
### 2866 (1*2866)
##
0794406 Jun 6 01:01 78567514-d7be-4190-8951-6455f43c7bc5
-rw-r--r-- 4 film tk 2381291004 Jun 6 01:23 789bdabc-d893-4853-9fae-75ff9b3e9d95
-rw-r--r-- 4 film tk 863532650 Jun 6 00:51 7e58294b-4ce0-4a21-8829-aa7b3c0abedc
-rw-r--r-- 4 film tk 27817391742 Jun 6 02:57 81d72c9f-5d4b-4d54-8cb1-a108dac46ff2
-rw-r--r-- 4 film tk 21342057477 Jun 6 04:35 83e64160-03a6-400d-924a-d1848d6b85b8
<...>
-rw-r--r-- 3 film tk 16603 Jun 6 01:23 PKL_992597cf-0c66-4f57-ba34-71706ccd7e53.xml
-rw-r--r-- 3 film tk 16599 Jun 6 01:23 PKL_b32fca6b-5f36-40fb-a64f-3d110edd1b74.xml
当然,这会破坏lines_process函数中的解析算法。
如何让服务器或libcurl将数据一块发送给我?或者有没有其他方法来确定答案是否被切分了?
非常感谢提前。
最佳答案
如何让服务器或libcurl将数据一块发送给我?
我认为最快和最简单的方法可能是在请求中指定HTTP协议的版本1.0。(分块编码仅在HTTP版本1.1中引入。)
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
或者有没有其他方法来确定答案是否被切分了?
您可以测试是否存在“传输编码”头并检查其值。首先需要安装头回调。
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, my_header_cb);
然后回调本身。。。
static size_t my_header_cb(char *data, size_t size, size_t nmemb,
void *userdata) {
size_t count = size * nmemb;
char *tok = NULL;
tok = strtok(data, ":");
if (!tok) {
fprintf(stderr, "Invalid header: %s\n", data);
return count;
}
puts(tok);
if (strcasecmp(tok, "transfer-encoding") == 0) {
tok = strtok(NULL, ":");
if (tok && strstr(tok, "hunked") != NULL) {
// Set a flag or do whatever else you need here.
printf("Using chunked encoding!\n");
}
}
return count;
}
如果希望回调,例如设置一个标志以指示正在使用分块编码,请向回调传递一个参数。
int chunked_flag = 0;
curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&chunked_flag);
关于c - libcurl,处理分块数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50986234/