libcurl的回调函数们

//------------------------------------------------------------------------------------------------------

// Callbacks supported in CURL

// Easy Interface
// ---------------------------------------------------------------------------------------------------

//
CURLOPT_PROGRESSFUNCTION
//函数正常情况下每秒被libcurl调用一次,为了使被调用,CURLOPT_NOPROGRESS必须被设置为false,CURLOPT_PROGRESSDATA指定参数
typedef int              (*curl_progress_callback)    (void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);

//CURLOPT_HEADERFUNCTION:
//CURLOPT_WRITEFUNCTION:
//CURLOPT_INTERLEAVEFUNCTION:
//This function gets called by libcurl as soon as it has received interleaved RTP data.
typedef size_t           (*curl_write_callback)       (char *buffer, size_t size, size_t nitems, void *outstream);

//CURLOPT_SEEKFUNCTION
//当libcurl需要定位到文件的特定位置时,就会调用相应的回调函数,并传递这里设置的输入
typedef int              (*curl_seek_callback)        (void *instream, curl_off_t offset, int origin);

//CURLOPT_READFUNCTION
//
typedef size_t           (*curl_read_callback)        (char *buffer, size_t size, size_t nitems, void *instream);

//CURLOPT_SOCKOPTFUNCTION
//
typedef int              (*curl_sockopt_callback)     (void *clientp, curl_socket_t curlfd, curlsocktype purpose);

//CURLOPT_OPENSOCKETFUNCTION
//
typedef curl_socket_t    (*curl_opensocket_callback)  (void *clientp, curlsocktype purpose, struct curl_sockaddr *address);

//CURLOPT_IOCTLFUNCTION
//the CURLOPT_SEEKFUNCTION/DATA pair is taking over what CURLOPT_IOCTLFUNCTION/DATA pair previously provided for seeking
typedef curlioerr        (*curl_ioctl_callback)       (CURL *handle, int cmd, void *clientp);

//CURLOPT_DEBUGFUNCTION
//
typedef int              (*curl_debug_callback)       (CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);

//CURLOPT_CONV_FROM_NETWORK_FUNCTION:
//CURLOPT_CONV_TO_NETWORK_FUNCTION:
//CURLOPT_CONV_FROM_UTF8_FUNCTION:
//
typedef CURLcode         (*curl_conv_callback)        (char *buffer, size_t length);

//CURLOPT_SSL_CTX_FUNCTION
//
typedef CURLcode         (*curl_ssl_ctx_callback)      (CURL *curl, void *openssl_ctx,  void *userptr);

// CURLOPT_SSH_KEYFUNCTION
//
typedef int              (*curl_sshkeycallback)        (CURL *easy, const struct curl_khkey *knownkey,  const struct curl_khkey *foundkey, enum curl_khmatch, void *clientp);

// Memory Related
//
typedef void *           (*curl_malloc_callback)       (size_t size);
typedef void             (*curl_free_callback)         (void *ptr);
typedef void *           (*curl_realloc_callback)      (void *ptr, size_t size);
typedef char *           (*curl_strdup_callback)       (const char *str);
typedef void *           (*curl_calloc_callback)       (size_t nmemb, size_t size);


// Other
//
typedef size_t           (*curl_formget_callback)      (void *arg, const char *buf, size_t len);


// Multi Interface
// ---------------------------------------------------------------------------------------------------
typedef int              (*curl_socket_callback)       (CURL *easy, curl_socket_t s, int what, void *userp, void *socketp);

typedef int              (*curl_multi_timer_callback)  (CURLM *multi, long timeout_ms, void *userp);


// Shared Interface
// ---------------------------------------------------------------------------------------------------
typedef void             (*curl_lock_function)         (CURL *handle, curl_lock_data data, curl_lock_access locktype, void *userptr);
typedef void             (*curl_unlock_function)       (CURL *handle, curl_lock_data data, void *userptr);
`curl_easy_setopt`是libcurl库中的一个函数,用于设置cURL会话的各种选项。其中可以设置一个回调函数,比如`curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_callback)`,以便在数据传输过程中接收进度信息或其他自定义处理。 当你设置了回调函数,每次发生需要通知你的事件(例如数据已经写入、请求完成等),库就会调用这个回调。回调函数通常会有一个标志或者其他机制来指示是否已处理完当前事件。例如: 1. **标志变量**:你可以在回调内部维护一个布尔型标志,每当回调结束时将其设为`true`,然后在外部检查这个标志判断回调是否已完成。 ```c bool done = false; size_t write_func(void *contents, size_t size, size_t nmemb, void *userp) { // ...处理数据... done = true; // 标记回调已处理完毕 return size * nmemb; } ``` 2. **返回值**:某些回调函数可能会返回一个特殊的值,如0表示成功并完成,非零值表示还有更多数据待处理。 3. **结构体指针**:如果你的回调函数接收了一个指向特定结构体的指针,可以在那个结构体内添加一个标识状态的成员,并在回调结束后更新它。 ```c typedef struct { bool finished; } MyCallbackData; void my_write_callback(char *data, size_t size, size_t count, void *ptr) { MyCallbackData *cb_data = (MyCallbackData*) ptr; cb_data->finished = true; } ``` 4. **外部计数器**:如果你对回调次数有记录,可以维护一个全局或局部计数器,在回调开始时加一,在结束时减一,当计数器归零时,说明所有回调都已完成。 了解了这些方法后,你在外部可以根据上述策略来判断回调是否已经调用完毕。记住,每个具体的回调API设计可能会有所不同,所以最好查阅官方文档以获取准确的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值