将CURLOPT_CONNECT_TO与IPv6地址

时间:2018-01-20 17:43:32

标签: libcurl ipv6

我正在尝试使用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)

2 个答案:

答案 0 :(得分:2)

libcurl中存在一个错误(在7.58.0之前),它使用IPv6地址并尝试将它们用于CURLOPT_CONNECT_TO,即使它是在不支持IPv6的情况下构建的!

这是在curl 7.58.0中解决的,从那以后它会使libcurl在尝试这个时返回错误!

答案 1 :(得分:0)

答案:Curl Library是在没有IPv6支持的情况下构建的。

我在想,这可能会产生更有意义的错误信息。