Esempio n. 1
0
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);
	}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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);

}