curl + c-ares CURLE_COULDNT_RESOLVE_HOST Could not resolve hostname
新版本的c-ares在未设置dns服务器地址的情况下,默认使用127.0.0.1作为dns服务器地址,进而导致无法解析域名。简单的解决方法是,获取默认的系统dns服务器地址并设置,即可。
QString GetSystemDnsServers() {
ULONG ulOutBufLen = 0;
FIXED_INFO* pFixedInfo = nullptr;
DWORD dwRetVal = GetNetworkParams(nullptr, &ulOutBufLen);
if (dwRetVal != ERROR_BUFFER_OVERFLOW || ulOutBufLen == 0) {
return QString();
}
pFixedInfo = (FIXED_INFO*)malloc(ulOutBufLen);
if (!pFixedInfo) return QString();
QStringList dnsList;
dwRetVal = GetNetworkParams(pFixedInfo, &ulOutBufLen);
if (dwRetVal == NO_ERROR) {
IP_ADDR_STRING* pDNS = &pFixedInfo->DnsServerList;
while (pDNS) {
if (pDNS->IpAddress.String[0] != '\0') {
QString ip = QString::fromUtf8(pDNS->IpAddress.String);
if (!ip.isEmpty() && ip != "0.0.0.0") {
dnsList << ip;
}
}
pDNS = pDNS->Next;
}
}
free(pFixedInfo);
return dnsList.join(',');
}
static std::string GetConfiguredDnsServersUtf8() {
static std::string s_dns;
static bool s_inited = false;
if (!s_inited) {
s_inited = true;
QString dns = g_configManager.GetDnsServers();
if (dns.isEmpty()) {
dns = GetSystemDnsServers();
}
if (!dns.isEmpty()) {
s_dns = dns.toStdString();
}
}
return s_dns;
}
调用:
std::string dns = GetConfiguredDnsServersUtf8();
if (!dns.empty()) {
curl_easy_setopt(m_curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_easy_setopt(m_curl, CURLOPT_DNS_SERVERS, dns.c_str());
}
评论0
暂时没有评论