如何解决curl 替代 InternetReadFile
我想检查 curl 是否有任何替代方法,例如 InternetReadFile,它返回缓冲区大小中指定大小的内容。
我用过:
curl_easy_setopt(curl_handle,CURLOPT_WRITEFUNCTION,Read_Cb);
curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA,&ReadBuffer);
curl_easy_perform(curl_handle);
但是我的 Read_Cb 被多次回调(这是记录在案的行为),这很好。 我希望 curl_easy_perform 在达到缓冲区大小时返回。我探索了 CURLOPT_BUFFERSIZE,但这似乎没有帮助。
CURLE_WRITE_ERROR 是一个问题,因为它会中止传输。我可以从我的回调中返回一些东西,它会优雅地告诉 curl 返回 curl_easy_perform。
解决方法
CURLOPT_RANGE 有帮助吗?
CURL *curl = curl_easy_init();
if (curl)
{
size_t from = 0,to = 1024;
char range[64];
snprintf(range,sizeof range,"%zu-%zu",from,to);
curl_easy_setopt(curl,CURLOPT_URL,"http://example.com");
curl_easy_setopt(curl,CURLOPT_RANGE,range);
curl_easy_perform(curl);
}
,
如果服务器支持范围请求,请使用 HTTP 范围:
CURL* curl = curl_easy_init();
if (curl) {
char range[32];
const size_t size = 65536;
snprintf(range,sizeof(range),"0-%zu",size - 1);
curl_easy_setopt(curl,"http://httpbin.org/range/65536");
curl_easy_setopt(curl,range);
curl_easy_perform(curl);
}
有关详细信息,请参阅 CURLOPT_RANGE。
如果服务器不支持范围请求,则在达到大小时使用 progress 或 write 函数终止请求。
const size_t size = 65535;
struct memory {
char* response;
size_t size;
};
static size_t cb(void* data,size_t size,size_t nmemb,void* userp) {
size_t realsize = size * nmemb;
struct memory* mem = (struct memory*)userp;
if (mem->size + realsize > size)
realsize = size - mem->size;
char* ptr = realloc(mem->response,mem->size + realsize);
if (ptr == NULL)
return 0; /* out of memory! */
mem->response = ptr;
memcpy(&(mem->response[mem->size]),data,realsize);
mem->size += realsize;
/* if realsize < size * nmemb,this will cause the transfer to get
aborted and curl_easy_perform will return URLE_WRITE_ERROR */
return realsize;
}
struct memory chunk = {0};
CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl,"http://httpbin.org/stream-bytes/131072");
/* send all data to this function */
curl_easy_setopt(curl_handle,CURLOPT_WRITEFUNCTION,cb);
/* we pass our 'chunk' struct to the callback function */
curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA,(void*)&chunk);
curl_easy_perform(curl);
}
如果不需要 URLE_WRITE_ERROR,您可以使用 curl_multi_perform(multi,&running_handles)
并在达到大小时从 multi
中删除句柄。有关详情,请参阅 curl_multi_remove_handle。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。