libcurl,如何为每个句柄附加不同的回调函数?
libcurl, How to attach a different callback function for each handle?
libcurl 允许您为每个文件传输创建一个 "handle"。它允许您为文件指定一个 URL 和一个回调函数,该回调函数将接收从 URL 检索到的文件的点点滴滴。如果你想为每个句柄设置不同的回调怎么办?你会怎么做呢?请记住,回调必须是非成员函数(或静态成员函数)。
一种方法是为每个句柄手动键入不同的回调,例如:
size_t callback1(void* buffer, size_t size, size_t nmem, void* userp);
size_t callback2(void* buffer, size_t size, size_t nmem, void* userp);
size_t callback3(void* buffer, size_t size, size_t nmem, void* userp);
// ...etc
这行得通,除非您动态地创建句柄。考虑这样的函数:
void f(){
CURLHandle handle = curl_easy_init();
// set the url to some random url
// set a *unique* call back for this handle
}
你会怎么做?如果您可以使用成员函数作为回调,解决方案会很简单,但您不能。
因为 curl 是 C 语言,所以你必须以 C 语言的方式来做这件事。回调需要是静态的。要访问您的 class 变量,您应该将参数传递给回调(参见 CURLOPT_WRITEDATA). This can also be a "this" object or a pointer to a std::string I suppose.. See the getinmemory.c 示例。
libcurl 允许您为每个文件传输创建一个 "handle"。它允许您为文件指定一个 URL 和一个回调函数,该回调函数将接收从 URL 检索到的文件的点点滴滴。如果你想为每个句柄设置不同的回调怎么办?你会怎么做呢?请记住,回调必须是非成员函数(或静态成员函数)。
一种方法是为每个句柄手动键入不同的回调,例如:
size_t callback1(void* buffer, size_t size, size_t nmem, void* userp);
size_t callback2(void* buffer, size_t size, size_t nmem, void* userp);
size_t callback3(void* buffer, size_t size, size_t nmem, void* userp);
// ...etc
这行得通,除非您动态地创建句柄。考虑这样的函数:
void f(){
CURLHandle handle = curl_easy_init();
// set the url to some random url
// set a *unique* call back for this handle
}
你会怎么做?如果您可以使用成员函数作为回调,解决方案会很简单,但您不能。
因为 curl 是 C 语言,所以你必须以 C 语言的方式来做这件事。回调需要是静态的。要访问您的 class 变量,您应该将参数传递给回调(参见 CURLOPT_WRITEDATA). This can also be a "this" object or a pointer to a std::string I suppose.. See the getinmemory.c 示例。