1diff --git a/src/lib/ares_getaddrinfo.c b/src/lib/ares_getaddrinfo.c
2index 0a0225a..4c3668e 100644
3--- a/src/lib/ares_getaddrinfo.c
4+++ b/src/lib/ares_getaddrinfo.c
5@@ -57,6 +57,80 @@
6 #  include "ares_platform.h"
7 #endif
8 
9+#if OHOS_DNS_PROXY_BY_NETSYS
10+#include <dlfcn.h>
11+#include <stdio.h>
12+
13+#if DNS_CONFIG_DEBUG
14+#ifndef DNS_CONFIG_PRINT
15+#define DNS_CONFIG_PRINT(fmt, ...) printf("DNS " fmt "\n", ##__VA_ARGS__)
16+#endif
17+#else
18+#define DNS_CONFIG_PRINT(fmt, ...)
19+#endif
20+
21+#define DNS_SO_PATH "libnetsys_client.z.so"
22+#define OHOS_JUDGE_IPV6_FUNC_NAME "NetSysIsIpv6Enable"
23+typedef int (*JudgeIpv6)(uint16_t netId);
24+
25+static void *open_dns_lib(void)
26+{
27+  static void *lib = NULL;
28+  if (lib != NULL) {
29+    return lib;
30+  }
31+
32+  lib = dlopen(DNS_SO_PATH, RTLD_LAZY);
33+  if (lib == NULL) {
34+    DNS_CONFIG_PRINT("%s: dlopen %s failed: %s", __func__, DNS_SO_PATH, dlerror());
35+    return NULL;
36+  }
37+  return lib;
38+}
39+
40+static void *load_from_dns_lib(const char *symbol)
41+{
42+  void *lib_handle = open_dns_lib();
43+  if (lib_handle == NULL) {
44+    return NULL;
45+  }
46+
47+  void *sym_addr = dlsym(lib_handle, symbol);
48+  if (sym_addr == NULL) {
49+    DNS_CONFIG_PRINT("%s: loading symbol %s with dlsym failed: %s", __func__, symbol, dlerror());
50+  }
51+  return sym_addr;
52+}
53+
54+static JudgeIpv6 load_ipv6_judger(void)
55+{
56+  static JudgeIpv6 ipv6_judger = NULL;
57+  if (ipv6_judger != NULL) {
58+    return ipv6_judger;
59+  }
60+  ipv6_judger = (JudgeIpv6)load_from_dns_lib(OHOS_JUDGE_IPV6_FUNC_NAME);
61+  return ipv6_judger;
62+}
63+#endif
64+
65+static int IsIpv6Enable()
66+{
67+  int ret = 0;
68+#if OHOS_DNS_PROXY_BY_NETSYS
69+  JudgeIpv6 func = load_ipv6_judger();
70+  if (!func) {
71+    return 0;
72+  }
73+
74+  uint16_t netid = 0;
75+  ret = func(netid);
76+  if (ret < 0) {
77+    return 0;
78+  }
79+#endif
80+  return ret;
81+}
82+
83 struct host_query
84 {
85   ares_channel channel;
86@@ -744,13 +818,18 @@ static int next_dns_lookup(struct host_query *hquery)
87             ares_query(hquery->channel, s, C_IN, T_A, host_callback, hquery);
88             break;
89           case AF_INET6:
90-            hquery->remaining += 1;
91-            ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery);
92+            if (IsIpv6Enable()) {
93+              hquery->remaining += 1;
94+              ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery);
95+            }
96             break;
97           case AF_UNSPEC:
98-            hquery->remaining += 2;
99+            hquery->remaining += 1;
100             ares_query(hquery->channel, s, C_IN, T_A, host_callback, hquery);
101-            ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery);
102+            if (IsIpv6Enable()) {
103+              hquery->remaining += 1;
104+              ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery);
105+            }
106             break;
107           default: break;
108         }
109