From 5224febbe932c2d54acccb6476df8cbe01898c5c Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Fri, 4 Jan 2019 19:36:15 +0800 Subject: [PATCH] Fix creash issue, optimize timeout --- src/dns_client.c | 2 +- src/dns_server.c | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/dns_client.c b/src/dns_client.c index 376529b..10c1054 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -536,7 +536,7 @@ void _dns_client_period_run(void) pthread_mutex_lock(&client.domain_map_lock); list_for_each_entry_safe(query, tmp, &client.dns_request_list, dns_request_list) { - if (now - query->send_tick >= 1000) { + if (now - query->send_tick >= 400 && query->send_tick > 0) { list_add(&query->period_list, &check_list); _dns_client_query_get(query); } diff --git a/src/dns_server.c b/src/dns_server.c index 779e9b6..990e414 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -51,10 +51,10 @@ #define DNS_MAX_EVENTS 256 #define DNS_SERVER_TMOUT_TTL (5 * 60) #define DNS_CONN_BUFF_SIZE 4096 -#define DNS_REQUEST_MAX_TIMEOUT 1000 -#define DNS_PING_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT - 50) +#define DNS_REQUEST_MAX_TIMEOUT 850 +#define DNS_PING_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT) #define DNS_TCPPING_START (300) -#define DNS_PING_TCP_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT - DNS_TCPPING_START - 50) +#define DNS_PING_TCP_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT - DNS_TCPPING_START) struct dns_conn_buf { char buf[DNS_CONN_BUFF_SIZE]; @@ -855,6 +855,8 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain, int i = 0; int j = 0; struct dns_rrs *rrs = NULL; + int ping_timeout = DNS_PING_TIMEOUT; + unsigned long now = get_tick_count(); if (packet->head.rcode != DNS_RC_NOERROR && packet->head.rcode != DNS_RC_NXDOMAIN) { if (request->rcode == DNS_RC_SERVFAIL) { @@ -865,6 +867,14 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain, return -1; } + + ping_timeout = ping_timeout - (now - request->send_tick); + if (ping_timeout > DNS_PING_TIMEOUT) { + ping_timeout = DNS_PING_TIMEOUT; + } else if (ping_timeout < 10) { + ping_timeout = 10; + } + for (j = 1; j < DNS_RRS_END; j++) { rrs = dns_get_rrs_start(packet, j, &rr_count); for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) { @@ -918,7 +928,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain, request->rcode = packet->head.rcode; sprintf(ip, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); - if (_dns_server_ping(request, PING_TYPE_ICMP, ip, DNS_PING_TIMEOUT) != 0) { + if (_dns_server_ping(request, PING_TYPE_ICMP, ip, ping_timeout) != 0) { _dns_server_request_release(request); } } break; @@ -964,7 +974,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain, sprintf(ip, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]); - if (_dns_server_ping(request, PING_TYPE_ICMP, ip, DNS_PING_TIMEOUT) != 0) { + if (_dns_server_ping(request, PING_TYPE_ICMP, ip, ping_timeout) != 0) { _dns_server_request_release(request); } } break;