我正在尝试使用curl的CURLOPT_CONNECT_TO选项连接到特定地址(而不是网址主机部分的DNS查找结果):
CURL * r_curl = NULL;
struct curl_slist * r_connect = NULL;
char connectStr[128];
if (af == AF_INET) {
sprintf(connectStr, "::%s:", ipAddrString);
} else if (af == AF_INET6) {
/* in [] per https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html */
sprintf(connectStr, "::[%s]:", ipAddrString);
}
fprintf(stderr, "DEBUG: connect '%s', url %s\n", connectStr, url);
r_curl = curl_easy_init();
...
r_connect = curl_slist_append(r_connect, connectStr);
curl_easy_setopt(r_curl, CURLOPT_CONNECT_TO, r_connect);
curl_easy_setopt(r_curl, CURLOPT_URL, url);
curl_easy_perform(r_curl);
当af
为AF_INET且ipAddrSring
为IPv4地址时,此功能完美无缺。如果af
是AF_INET6且ipAddrSring
是IPv6地址,则curl看起来像是在尝试对IPv6地址执行DNS主机查找:
DEBUG:connect' :: 129.186.23.166:',url http://www.iastate.edu/
*连接到主机名:129.186.23.166
*尝试129.186.23.166 ...
* TCP_NODELAY设置
*连接至129.186.23.166(129.186.23.166)端口80(#0)
VS
DEBUG:connect' :: [2610:130:101:104 :: 2]:',url http://www.iastate.edu/
*连接到主机名:2610:130:101:104 :: 2
*无法解析主持人:2610:130:101:104 :: 2
我在这里做错了什么?
(Curl是版本7.56.1)
答案 0 :(得分:2)
libcurl中存在一个错误(在7.58.0之前),它使用IPv6地址并尝试将它们用于CURLOPT_CONNECT_TO,即使它是在不支持IPv6的情况下构建的!
这是在curl 7.58.0中解决的,从那以后它会使libcurl在尝试这个时返回错误!
答案 1 :(得分:0)
答案:Curl Library是在没有IPv6支持的情况下构建的。
我在想,这可能会产生更有意义的错误信息。