void service_set_dns(SERVICE *service, ACL_AIO *aio, const char *dns_list, int dns_lookup_timeout, int dns_cache_limit, const char *hosts_list) { const char *myname = "service_set_dns"; ACL_ARGV *argv; ACL_ITER iter; /* 创建DNS域名查询对象:外挂式查询或非阻塞式查询 */ if (!dns_list || !strcmp(dns_list, "")) { int nthreads = 100, idle = 60; /* 创建外挂式DNS查询对象 */ service->dns_server = dns_server_create(aio, 300); service->dns_table = acl_htable_create(100, 0); /* 创建半驻留线程池对象 */ service->wq = acl_workq_create(nthreads, idle, NULL, NULL); return; } /* 采用直接发送DNS协议方式进行查询的对象 */ argv = acl_argv_split(dns_list, ",; \t"); service->dns_handle = acl_dns_create(aio, dns_lookup_timeout); if (dns_cache_limit > 0) acl_dns_open_cache(service->dns_handle, dns_cache_limit); /* 添加DNS服务器地址 */ acl_foreach(iter, argv) { char *addr = (char*) iter.data; char *ptr1 = strchr(addr, ':'), *ptr2; int port, netmask = 24; if (ptr1) { *ptr1++ = 0; ptr2 = strchr(ptr1, ':'); if (ptr2) { *ptr2++ = 0; netmask = atoi(ptr2); if (netmask <= 0 || netmask >= 32) netmask = 24; } port = atoi(ptr1); if (port <= 0 || port >= 65535) port = 53; } else port = 53; acl_msg_info("%s(%d): add dns addr (%s:%d)", myname, __LINE__, addr, port); acl_dns_add_dns(service->dns_handle, addr, port, netmask); }
dnscache_t * dnscache_create(char *server_addr, uint16_t port, uint32_t thread_num) { dnscache_t *dnscache = malloc(sizeof(dnscache_t)); if (!dnscache) return NULL; dnscache->thread_count_ = thread_num; dnscache->base_event_ = event_base_new(); dnscache_init_sig(dnscache); dnscache->tp_ = thread_pool_create(thread_num); ASSERT(dnscache->tp_, "thread pool create failed"); addr_t addr; addr_init(&addr, server_addr, port); dnscache->listen_socket = (socket_t *)malloc(sizeof(socket_t)); int socket_type = addr_get_type(&addr) == ADDR_IPV4 ? AF_INET : AF_INET6; socket_open(dnscache->listen_socket, socket_type, SOCK_DGRAM, 0); socket_set_unblock(dnscache->listen_socket, true); socket_set_addr_reusable(dnscache->listen_socket); int ret = socket_bind(dnscache->listen_socket, &addr); ASSERT(ret == 0, "udp server bind failed\n"); int threads_len = thread_num * sizeof(thread_local_param_t *); dnscache->thread_params_ = (thread_local_param_t **)malloc(threads_len); ASSERT(dnscache->thread_params_ != NULL, "udp server bind failed\n"); int i = 0; for (; i < thread_num; ++i) { dnscache->thread_params_[i] = (thread_local_param_t *)malloc(sizeof(thread_local_param_t)); thread_local_param_t *tlp = dnscache->thread_params_[i]; tlp->thread_id_ = i; tlp->base_ = event_base_new(); tlp->dns_server_ = dns_server_create(tlp->base_, UDP_SERVER, dnscache->listen_socket, queue_size); thread_pool_set_thread_data(dnscache->tp_, i, tlp); } return dnscache; }
static void zipper_init_server(zipper_t *zipper) { config_t *zipper_server_config = NULL; int ret = conf_get_sub_config(zipper->config_, "server_config", &zipper_server_config); ASSERT(ret == 0, "get configure for server failed\n"); char ip[MAX_IP_STR_LEN]; int port; conf_get_string(zipper_server_config, "ip", ip); conf_get_integer(zipper_server_config, "port", &port); zipper->dns_server_ = dns_server_create(zipper->base_event_, UDP_SERVER, ip, port); conf_destroy(zipper_server_config); command_server_get_named_ip(zipper->command_server_, ip); port = command_server_get_named_port(zipper->command_server_); zipper->dns_client_ = dns_client_create(zipper->base_event_, UDP_CLIENT, ip, port); }