4G_module/include/cmiot/cm_async_dns.h

137 lines
4.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file cm_async_dns.h
* @brief 异步DNS解析接口
* @copyright Copyright © 2021 China Mobile IOT. All rights reserved.
* @author By wangk
* @date 2021/08/16
*
* @defgroup async_dns async_dns
* @ingroup NET
* @{
*/
#ifndef __CM_ASYNC_DNS_H__
#define __CM_ASYNC_DNS_H__
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdint.h>
// 包含平台特定的socket头文件
#include "lwip/sockets.h" // lwip socket
#include "cm_eloop.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Public Types
****************************************************************************/
/** DNS resolve types */
typedef enum
{
CM_ASYNC_DNS_ADDRTYPE_IPV4 = 0, /**< resolve IPv4 address */
CM_ASYNC_DNS_ADDRTYPE_IPV6, /**< resolve IPv6 address */
CM_ASYNC_DNS_ADDRTYPE_IPV4_IPV6, /**< try to resolve IPv4 first, try IPv6 if IPv4 fails only */
CM_ASYNC_DNS_ADDRTYPE_IPV6_IPV4, /**< try to resolve IPv6 first, try IPv4 if IPv6 fails only */
} cm_async_dns_addrtype_e;
/** 异步DNS解析事件类型 */
typedef enum
{
CM_ASYNC_DNS_EV_NONE = 0,
// responses
CM_ASYNC_DNS_RESOLVE_OK, /**< 域名解析成功 */
CM_ASYNC_DNS_RESOLVE_FAIL, /**< 域名解析失败 */
} cm_async_dns_event_e;
/** IP地址(异步DNS解析结果)类型 */
typedef struct cm_async_dns_ip_addr
{
cm_async_dns_addrtype_e type; /**< 地址类型(IPv4或IPv6) */
union {
struct in_addr sin_addr; /**< IPv4 address */
struct in6_addr sin6_addr; /**< IPv6 address */
} u_addr;
} cm_async_dns_ip_addr_t;
/**
异步DNS解析事件回调函数类型
@param req_id [in] 请求ID
@param event [in] 事件类型
@param cb_param [in] 用户参数(创建socket时指定)
@param host_name [in] 域名
@param ip_addr [in] IP地址(DNS解析结果)
*/
typedef void (*cm_async_dns_event_cb)(int req_id, cm_async_dns_event_e event, void *cb_param,
const char *host_name, const cm_async_dns_ip_addr_t *ip_addr);
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C" {
#else
#define EXTERN extern
#endif
/**
* @brief 获取异步dns模块运行的Event Loop
*
* @return
* 本模块运行的Event Loop
*
* @details 获取本模块运行的Event Loop(初始化传入或者系统默认Event Loop)
*/
cm_eloop_handle_t cm_async_dns_eloop(void);
/**
* @brief 设置DNS解析全局优先级
*
* @param [in] priority DNS解析优先级0v4优先1v6优先默认v6优先
*
* @return
* = 0 - 成功 \n
* < 0 - 失败
*
* @details 开机默认v6优先若使用业务(MQTT/HTTP/NTP)时单独配置了通道优先级,则全局优先级对该业务通道将不生效
*/
int32_t cm_async_dns_set_priority(uint8_t priority);
/**
* @brief 请求执行异步DNS解析
*
* @param [in] host_name 域名
* @param [in] addr_type 地址类型(IPV4或IPV6)
* @param [out] ip_addr IP地址(DNS解析结果)
* @param [in] event_cb 异步事件回调函数
* @param [in] cb_param 用户参数(将作为参数传入event_cb)
*
* @return
* > 0 - DNS请求成功,返回异步DNS请求ID(等待回调函数传回执行结果) \n
* = 0 - DNS请求已完成(result输出解析结果) \n
* = -1 - 请求失败
*
* @details 请求执行异步DNS解析
*/
int cm_async_dns_request(const char *host_name, cm_async_dns_addrtype_e addr_type,
cm_async_dns_ip_addr_t *ip_addr, cm_async_dns_event_cb event_cb, void *cb_param);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __CM_ASYNC_DNS_H__ */
/** @}*/