列举SDK提供的API,这些API定义于SDK的hdns_api.h中。
SDK环境创建/销毁
SDK运行需要初始化一些必须的全局资源,比如连接池、线程池、网络检测器等,这些全局资源被所有客户端实例所共享,需要在创建客户端实例之前进行初始化,并在退出SDK使用时释放。
/*
* @brief SDK环境初始化,主要包括全局随机数、session池、网络检测器、线程池
* @return 0:初始化成功;1:初始化失败
* @note:
* - 调用该接口之后,请务必调用一次hdns_sdk_cleanup进行资源释放
* - 该接口并非线程安全接口
*/
int hdns_sdk_init();
/*
*
* @brief 清理释放HTTPDNS SDK环境
* @node :
* - 该接口并非线程安全接口
*/
void hdns_sdk_cleanup();
客户端创建/配置/启动/销毁
HTTPDNS支持使用不同的账号ID初始化多个客户端实例,这些客户端实例负责与HTTPDNS服务端的交互和缓存管理。客户端实例的生命周期包含:创建、配置、启动和销毁,SDK提供了与该生命周期对应的接口。
/*
* @brief 创建客户端实例
* @param[in] account_id HTTPDNS账户ID
* @param[in] secret_key 用于加签HTTP请求的秘钥,如果不需要加签可以填NULL
* @return 创建成功返回客户端实例,否则返回NULL
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
hdns_client_t *hdns_client_create(const char *account_id, const char *secret_key);
/*
* @brief 设置本地缓存失效时,客户端单次请求服务端的最大超时时间
* @param[in] client 客户端实例
* @param[in] timeout 超时毫秒数
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_set_timeout(hdns_client_t *client, int32_t timeout);
/*
* @brief 设置服务是否使用本地缓存
* @param[in] client 客户端实例
* @param[in] using_cache false:不使用本地缓存,true:使用本地缓存
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_set_using_cache(hdns_client_t *client, bool using_cache);
/*
* @brief 设置访问HTTPDNS服务器时是否使用https协议
* @param[in] client 客户端实例
* @param[in] using_https false:不使用https协议,true:使用https协议
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_set_using_https(hdns_client_t *client, bool using_https);
/*
* @brief 设置访问HTTPDNS服务器时是否对请求进行签名
* @param[in] client 客户端实例
* @param[in] using_sign false:签名,true:签名
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_set_using_sign(hdns_client_t *client, bool using_sign);
/*
* @brief 设置访问HTTPDNS服务器时的重试次数,默认为1
* @param[in] client 客户端实例
* @param[in] retry_times 重试次数
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_set_retry_times(hdns_client_t *client, int32_t retry_times);
/*
* @brief 设置访问HTTPDNS服务器的集群
* @param[in] client 客户端实例
* @param[in] region global: 就近访问(默认),cn:中国大陆,hk:中国香港,sg: 新加坡,us: 美国,de: 德国
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_set_region(hdns_client_t *client, const char *region);
/*
* @brief 设置HTTPDNS调度中心的region
* @param[in] client 客户端实例
* @param[in] region cn:中国大陆(默认),hk:中国香港,sg: 新加坡,us: 美国,de: 德国
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_set_schedule_center_region(hdns_client_t *client, const char *region);
/*
* @brief 是否开启网络变化时缓存更新
* @param[in] client 客户端实例
* @param[in] enable true: 刷新,false:不刷新
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_enable_update_cache_after_net_change(hdns_client_t *client, bool enable);
/*
* @brief 是否开启允许使用过期ip
* @param[in] client 客户端实例
* @param[in] enable true: 允许使用过期ip,false:不允许
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_enable_expired_ip(hdns_client_t *client, bool enable);
/*
* @brief 是否允许降级到localdns
* @param[in] client 客户端实例
* @param[in] enable true: 允许使用过期ip,false:不允许
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_enable_failover_localdns(hdns_client_t *client, bool enable);
/*
* @brief 添加客户端启动时预解析的域名
* @param[in] client 客户端实例
* @param[in] host 预解析域名
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_add_pre_resolve_host(hdns_client_t *client, const char *host);
/*
* @brief 添加进行IP嗅探的域名和端口,一个域名只允许探测一个端口
* @param[in] client 客户端实例
* @param[in] host 探测域名
* @param[in] port 探测端口
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_add_ip_probe_item(hdns_client_t *client, const char *host, const int port);
/*
* @brief 针对某个域名,添加一个自定义的解析ttl,仅对HTTPDNS的解析结果有效,降级到localdns无效
* @param[in] client 客户端实例
* @param[in] host 探测域名
* @param[in] ttl 自定义ttl
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
void hdns_client_add_custom_ttl_item(hdns_client_t *client, const char *host, const int ttl);
/*
* @brief 启动客户端,执行域名的异步预解析和拉取域名解析服务器列表
* @param[in] client 客户端实例
* @return 客户端启动状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t是线程安全的,可多线程共享
*/
hdns_status_t hdns_client_start(hdns_client_t *client);
/*
*
* @brief 清理释放HTTPDNS客户端资源
*
* @param[in] client 客户端实例
*/
void hdns_client_cleanup(hdns_client_t *client);
标准域名解析接口
HTTPDNS客户端启动之后可以通过标准的接口进行域名解析,根据同步/异步接口、使用缓存/不使用缓存解析、单域名/批量域名解析,SDK共提供了8个标准的接口,其中同步接口hdns_get_result_for_host_sync_with_cache和异步接口hdns_get_result_for_host_async_with_cache的域名解析逻辑与LocalDNS等价:优先查询本地缓存,缓存未命中则请求DNS服务端。
/*
*
* @brief 单域名同步解析,阻塞线程,先查缓存,缓存为空则查询HTTPDNS服务器,直到结果返回或者超时
* @param[in] client 客户端实例
* @param[in] host 待解析的域名
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[out] results 解析结果,需要通过hdns_list_cleanup进行内存释放
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_result_for_host_sync_with_cache(hdns_client_t *client,
const char *host,
hdns_query_type_t query_type,
const char *client_ip,
hdns_list_head_t **results);
/*
*
* @brief 单域名同步解析,阻塞线程,查询HTTPDNS服务器,直到结果返回或者超时
* @param[in] client 客户端实例
* @param[in] host 待解析的域名
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[out] results 解析结果,需要通过hdns_list_cleanup进行内存释放
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_result_for_host_sync_without_cache(hdns_client_t *client,
const char *host,
hdns_query_type_t query_type,
const char *client_ip,
hdns_list_head_t **results);
/*
*
* @brief 批量域名同步解析,阻塞线程,先查缓存,缓存为空则查询HTTPDNS服务器,直到结果返回或者超时
*
* @param[in] client 客户端实例
* @param[in] hosts 待解析的域名列表
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[out] results 解析结果,需要通过hdns_list_cleanup进行内存释放
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_results_for_hosts_sync_with_cache(hdns_client_t *client,
const hdns_list_head_t *hosts,
hdns_query_type_t query_type,
const char *client_ip,
hdns_list_head_t **results);
/*
*
* @brief 批量域名同步解析,阻塞线程,查询HTTPDNS服务器,直到结果返回或者超时
*
* @param[in] client 客户端实例
* @param[in] hosts 待解析的域名列表
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[out] results 解析结果,需要通过hdns_list_cleanup进行内存释放
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_results_for_hosts_sync_without_cache(hdns_client_t *client,
const hdns_list_head_t *hosts,
hdns_query_type_t query_type,
const char *client_ip,
hdns_list_head_t **results);
/*
* @brief 异步解析回调函数
* @param[in] status 解析最终状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @param[in] results 解析结果列表
* @param[in] param 用户传递的自定义参数
*/
typedef void (*hdns_resv_done_callback_pt)(hdns_status_t *status, hdns_list_head_t *results, void *param);
/*
*
* @brief 单域名异步解析,不阻塞线程,先查缓存,缓存为空则查询HTTPDNS服务器,直到结果返回或者超时,最后触发函数回调
*
* @param[in] client 客户端实例
* @param[in] host 待解析的域名
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[in] cb 解析结束后的回调函数
* @param[in] cb_param 回调函数的用户自定义参数
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_result_for_host_async_with_cache(hdns_client_t *client,
const char *host,
hdns_query_type_t query_type,
const char *client_ip,
hdns_resv_done_callback_pt cb,
void *cb_param);
/*
*
* @brief 单域名异步解析,不阻塞线程,查询HTTPDNS服务器,直到结果返回或者超时,,最后触发函数回调
*
* @param[in] client 客户端实例
* @param[in] host 待解析的域名
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[in] cb 解析结束后的回调函数
* @param[in] cb_param 回调函数的用户自定义参数
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_result_for_host_async_without_cache(hdns_client_t *client,
const char *host,
hdns_query_type_t query_type,
const char *client_ip,
hdns_resv_done_callback_pt cb,
void *cb_param);
/*
*
* @brief 批量域名异步解析,不阻塞线程,先查缓存,缓存为空则查询HTTPDNS服务器,直到结果返回或者超时,最后触发函数回调
*
* @param[in] client 客户端实例
* @param[in] hosts 待解析的域名列表
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[in] cb 解析结束后的回调函数
* @param[in] cb_param 回调函数的用户自定义参数
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_results_for_hosts_async_with_cache(hdns_client_t *client,
const hdns_list_head_t *hosts,
hdns_query_type_t query_type,
const char *client_ip,
hdns_resv_done_callback_pt cb,
void *cb_param);
/*
*
* @brief 批量域名异步解析,不阻塞线程,查询HTTPDNS服务器,直到结果返回或者超时,最后触发函数回调
*
* @param[in] client 客户端实例
* @param[in] hosts 待解析的域名列表
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[in] client_ip 可选,客户端ip, 默认为接口调用方的出口IP
* @param[in] cb 解析结束后的回调函数
* @param[in] cb_param 回调函数的用户自定义参数
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_results_for_hosts_async_without_cache(hdns_client_t *client,
const hdns_list_head_t *hosts,
hdns_query_type_t query_type,
const char *client_ip,
hdns_resv_done_callback_pt cb,
void *cb_param);
自定义域名解析接口
SDK提供了自定义域名解析的接口,用户可以通过接口配置解析请求的参数,主要用于软件定义解析需要传递业务参数的场景。
/*
* @brief 自定义同步解析
* @param[in] client 客户端实例
* @param[in] req 自定义解析请求实例
* @param[out] results 解析结果,需要通过hdns_list_cleanup进行内存释放
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_list_head_t是非线程安全的,多线程共享时应该通过互斥量等手段进行同步
*/
hdns_status_t hdns_get_result_for_host_sync_with_custom_request(hdns_client_t *client,
const hdns_resv_req_t *req,
hdns_list_head_t **results);
/*
* @brief 先进行自定义异步步解析,最后触发函数回调
* @param[in] client 客户端实例
* @param[in] req 自定义解析请求实例
* @param[in] cb 解析结束后的回调函数
* @param[in] cb_param 回调函数的用户自定义参数
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_client_t线程安全,可多线程共享
*/
hdns_status_t hdns_get_result_for_host_async_with_custom_request(hdns_client_t *client,
const hdns_resv_req_t *resv_req,
hdns_resv_done_callback_pt cb,
void *cb_param);
/*
* @brief 自定义域名解析时,创建解析请求实例
* @param[in] client 客户端实例
* @return 该客户端对应的请求实例
* @note :
* - hdns_resv_req_t是线程安全的,可多线程共享
*/
hdns_resv_req_t *hdns_resv_req_create(hdns_client_t *client);
/*
* @brief 自定义域名解析时,设置请求实例的客户端IP
* @param[in] client 客户端实例
* @param[in] client_ip 客户端IP
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_resv_req_t是线程安全的,可多线程共享
*/
hdns_status_t hdns_resv_req_set_client_ip(hdns_resv_req_t *req, const char *client_ip);
/*
* @brief 自定义域名解析时,设置请求实例的域名
* @param[in] req 请求实例
* @param[in] host 待解析域名
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_resv_req_t是线程安全的,可多线程共享
*/
hdns_status_t hdns_resv_req_set_host(hdns_resv_req_t *req, const char *host);
/*
* @brief 自定义域名解析时,添加业务参数对
* @param[in] req 请求实例
* @param[in] key 参数名
* @param[in] value 参数值
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_resv_req_t是线程安全的,可多线程共享
*/
hdns_status_t hdns_resv_req_append_sdns_param(hdns_resv_req_t *req, const char *key, const char *value);
/*
* @brief 自定义域名解析时,设置请求实例的DNS解析类型
* @param[in] req 请求实例
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_resv_req_t是线程安全的,可多线程共享
*/
hdns_status_t hdns_resv_req_set_query_type(hdns_resv_req_t *req, hdns_query_type_t query_type);
/*
* @brief 自定义域名解析时,设置解析结果的缓存key
* @param[in] req 请求实例
* @param[in] key 参数名
* @param[in] value 参数值
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_resv_req_t是线程安全的,可多线程共享
*/
hdns_status_t hdns_resv_req_set_cache_key(hdns_resv_req_t *req, const char *cache_key);
/*
* @brief 自定义域名解析时,释放请求实例资源
* @param[in] req 请求实例
*/
void hdns_resv_req_cleanup(hdns_resv_req_t *req);
/*
*
* @brief 返回软件自定义解析中的extra字段
*
* @param[in] results 已获取的解析结果
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[out] extra 写入extra的buffer
* @return 操作状态,0表示成功,否则表示失败
*/
int hdns_get_sdns_extra(hdns_list_head_t *results, hdns_query_type_t query_type, char *extra);
排查追踪
SDK提供了日志和会话追踪的功能,用于解析不符合预期时的问题排查。日志默认打印到控制台,日志级别为warn级。每个客户端实例都会产生一个与服务端交汇的SessionID,并在客户端实例生命周期内有效,SessionID会在每次请求时传递给服务端,当解析结果不符合预期时,根据该SessionID可以帮助确定问题原因。
/*
*
* @brief 设置SDK日志文件路径
*
* @param[in] file_path 日志文件路径
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
*/
hdns_status_t hdns_log_set_log_file_path(const char *file_path);
/*
*
* @brief 设置SDK日志等级
*
* @param[in] level 日志等级
* - HDNS_LOG_OFF 不打开日志
* - HDNS_LOG_FATAL fatal级及以下
* - HDNS_LOG_ERROR error级及以下
* - HDNS_LOG_WARN warn级及以下
* - HDNS_LOG_INFO info级及以下
* - HDNS_LOG_DEBUG debug级及以下
* - HDNS_LOG_TRACE trace级及以下
*/
void hdns_log_set_log_level(hdns_log_level_e level);
/*
* @brief 获取客户端的session id,用于问题排查
* @param[in] client 客户端实例
* @param[out] session_id session id
* @return 0 获取成功,否则失败
* @note:
* - session id 为长度12的字符串,请确保接收的buffer大于12
*/
int hdns_client_get_session_id(hdns_client_t *client, char *session_id);
缓存管理
支持手动清理某域名的本地解析缓存。
/*
*
* @brief 清除某域名的本地缓存
*
* @param[in] client 客户端实例
* @param[in] host 域名
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
*/
void hdns_remove_host_cache(hdns_client_t *client, const char *host);
辅助接口
工具性接口,用于降低用户使用SDK的复杂度。
/*
*
* @brief 从解析列表中随机选择一个ip,双栈时ipv4优先,仅适用于单个域名解析的情况
*
* @param[in] results 已获取的解析结果
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[out] ip 写入ip的buffer
* @return 操作状态,0表示成功,否则表示失败
*/
int hdns_select_ip_randomly(hdns_list_head_t *results, hdns_query_type_t query_type, char *ip);
/*
*
* @brief 返回解析ip列表中第一个ip,如果开启了ip优选,往往意味着最优ip,仅适用于单个域名解析的情况
*
* @param[in] results 已获取的解析结果
* @param[in] query_type 请求类型
* - HDNS_QUERY_AUTO:根据网络栈自动解析;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_IPV4:解析IPV4类型;
* - HDNS_QUERY_BOTH:解析IPV4和IPV6类型
* @param[out] ip 写入ip的buffer
* @return 操作状态,0表示成功,否则表示失败
*/
int hdns_select_first_ip(hdns_list_head_t *results, hdns_query_type_t query_type, char *ip);
/*
* @brief 创建链表实例
* @return 链表实例,如果失败返回NULL
* @note :
* - hdns_list_head_t非线程安全,多线程共享时应该通过互斥量等手段进行同步
*/
hdns_list_head_t *hdns_list_create();
/*
* @brief 向链表中添加字符串
* @return 操作状态,如果status的code是0表示成功,否则表示失败,error_msg包含了错误信息
* @note :
* - hdns_list_head_t非线程安全,多线程共享时应该通过互斥量等手段进行同步
*/
hdns_status_t hdns_list_add_str(hdns_list_head_t *list, const char *str);
/*
* @brief 释放链表资源
* @param[in] list 待释放的列表实例
* @note :
* - hdns_list_head_t非线程安全,多线程共享时应该通过互斥量等手段进行同步
*/
void hdns_list_cleanup(hdns_list_head_t *list);
文档内容是否对您有帮助?