#ifndef __DNS_SERVER_INCLUDE_H__ #define __DNS_SERVER_INCLUDE_H__ #include "lib_acl.h" #ifdef __cplusplus extern "C" { #endif #define USE_THREAD_POOL /* 外挂查询DNS模块采用线程池方式 */ /* 查询DNS的消息类型定义 */ #define DNS_MSG_LOOKUP ACL_MSGIO_USER + 100 #define DNS_MSG_LOOKUP_RESULT ACL_MSGIO_USER + 101 #define DNS_IP_MAX 5 typedef struct DNS_CTX DNS_CTX; typedef struct DNS_SERVER DNS_SERVER; typedef struct DNS_CACHE DNS_CACHE; typedef void (*DNS_CALLBACK)(const DNS_CTX *); struct DNS_CTX { /* public */ char domain_key[256]; /* 域名(小写) */ char ip[DNS_IP_MAX][64]; /* IP地址数组 */ int port[DNS_IP_MAX]; /* port 数组 */ int ip_cnt; /* IP地址数组中的有效IP地址个数 */ time_t begin; /* 开始查询时的时间截 */ /* public */ DNS_CALLBACK callback; /* 查询返回调用的用户的回调函数 */ void *context; /* 用户传递的参数 */ /* private */ DNS_SERVER *dns; /* DNS对象句柄,内部变量 */ ACL_MSGIO *mio; /* IO消息句柄,内部变量 */ ACL_DNS_DB *dns_db; /* 临时用以传递DNS查询结果,内部变量 */ }; struct DNS_SERVER { ACL_AIO *aio; /* 异步通信框架 */ acl_pthread_pool_t *wq; /* 线程池句柄 */ ACL_MSGIO *listener; /* 消息监听者句柄 */ ACL_MSGIO *mio; /* 消息句柄 */ char addr[256]; DNS_CACHE *dns_cache; /* DNS缓存句柄 */ acl_pthread_mutex_t lock; /* 线程锁 */ }; /* in dns_server.c */ DNS_SERVER *dns_server_create(ACL_AIO *aio, int timeout); void dns_server_close(DNS_SERVER *dns); void dns_server_static_add(DNS_SERVER *dns, const char *map, const char *delim, int def_port); int dns_server_lookup(DNS_SERVER *dns, const DNS_CTX *ctx); /* in dns_cache.c */ void dns_cache_push_one(DNS_CACHE *dns_cache, const ACL_DNS_DB *dns_db, int timeout); void dns_cache_push(DNS_CACHE *dns_cache, const ACL_DNS_DB *dns_db); void dns_cache_push2(DNS_CACHE *dns_cache, const DNS_CTX *dns_ctx); ACL_DNS_DB *dns_cache_lookup(DNS_CACHE *dns_cache, const char *name); void dns_cache_del_host(DNS_CACHE *dns_cache, const char *name); DNS_CACHE *dns_cache_create(int timeout, int thread_safe); /* in dns_hosts.c */ void dns_hosts_load(ACL_DNS *dns_handle, const char *filename); #ifdef __cplusplus } #endif #endif