diff --git a/src/dns.c b/src/dns.c index 1ce6d6a..959271e 100644 --- a/src/dns.c +++ b/src/dns.c @@ -836,15 +836,15 @@ int dns_get_SOA(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, struct if (ptr - data + 20 > len) { return -1; } - soa->serial = *((unsigned int *)ptr); + memcpy(&soa->serial, ptr, 4); ptr += 4; - soa->refresh = *((unsigned int *)ptr); + memcpy(&soa->refresh, ptr, 4); ptr += 4; - soa->retry = *((unsigned int *)ptr); + memcpy(&soa->retry, ptr, 4); ptr += 4; - soa->expire = *((unsigned int *)ptr); + memcpy(&soa->expire, ptr, 4); ptr += 4; - soa->minimum = *((unsigned int *)ptr); + memcpy(&soa->minimum, ptr, 4); ptr += 4; return 0; @@ -1537,7 +1537,7 @@ static int _dns_encode_opts(struct dns_packet *packet, struct dns_context *conte return 0; } -static int _dns_decode_opt(struct dns_context *context, dns_rr_type type, unsigned int ttl, int rr_len) +static int __attribute__((unused)) _dns_decode_opt(struct dns_context *context, dns_rr_type type, unsigned int ttl, int rr_len) { unsigned short opt_code; unsigned short opt_len; diff --git a/src/dns_client.c b/src/dns_client.c index 6c01530..77b2212 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -58,7 +58,7 @@ #define DNS_TCP_IDLE_TIMEOUT (60 * 10) #define DNS_TCP_CONNECT_TIMEOUT (5) #define DNS_QUERY_TIMEOUT (500) -#define DNS_QUERY_RETRY (6) +#define DNS_QUERY_RETRY (4) #define DNS_PENDING_SERVER_RETRY 40 #define SOCKET_PRIORITY (6) #define SOCKET_IP_TOS (IPTOS_LOWDELAY | IPTOS_RELIABILITY) @@ -117,6 +117,7 @@ struct dns_server_info { time_t last_send; time_t last_recv; + int prohibit; /* server addr info */ unsigned short ai_family; @@ -1004,6 +1005,7 @@ static int _dns_client_server_add(char *server_ip, char *server_host, int port, server_info->ttl = ttl; server_info->ttl_range = 0; server_info->skip_check_cert = skip_check_cert; + server_info->prohibit = 0; pthread_mutex_init(&server_info->lock, NULL); memcpy(&server_info->flags, flags, sizeof(server_info->flags)); @@ -2152,6 +2154,7 @@ static int _dns_client_process_tcp_buff(struct dns_server_info *server_info) } tlog(TLOG_DEBUG, "recv tcp packet from %s, len = %d", server_info->ip, len); + time(&server_info->last_recv); /* process result */ if (_dns_client_recv(server_info, inpacket_data, dns_packet_len, &server_info->addr, server_info->ai_addrlen) != 0) { @@ -2230,7 +2233,6 @@ static int _dns_client_process_tcp(struct dns_server_info *server_info, struct e return ret; } - time(&server_info->last_recv); server_info->recv_buff.len += len; if (server_info->recv_buff.len <= 2) { /* wait and recv */ @@ -2787,6 +2789,14 @@ static int _dns_client_send_packet(struct dns_query_struct *query, void *packet, list_for_each_entry_safe(group_member, tmp, &query->server_group->head, list) { server_info = group_member->server; + if (server_info->prohibit) { + time_t now; + time(&now); + if ((now - 60 < server_info->last_send) && (now - 5 > server_info->last_recv)) { + continue; + } + server_info->prohibit = 0; + } total_server++; tlog(TLOG_DEBUG, "send query to server %s", server_info->ip); if (server_info->fd <= 0) { @@ -2838,6 +2848,8 @@ static int _dns_client_send_packet(struct dns_query_struct *query, void *packet, time_t now; time(&now); if (now - 5 > server_info->last_recv || send_err != ENOMEM) { + server_info->prohibit = 1; + tlog(TLOG_INFO, "server %s not alive, prohibit", server_info->ip); _dns_client_shutdown_socket(server_info); }