【问题标题】:Using CURLOPT_CONNECT_TO with an IPv6 address将 CURLOPT_CONNECT_TO 与 IPv6 地址一起使用
【发布时间】:2018-01-20 17:43:32
【问题描述】:

我正在尝试使用 curl 的 CURLOPT_CONNECT_TO 选项连接到特定地址(而不是 URL 的主机部分的 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 主机查找:

调试:连接'::129.186.23.166:',网址http://www.iastate.edu/
* 连接主机名:129.186.23.166
* 正在尝试 129.186.23.166...
* TCP_NODELAY 设置
* 连接到 129.186.23.166 (129.186.23.166) 端口 80 (#0)

调试:连接'::[2610:130:101:104::2]:',网址http://www.iastate.edu/
* 连接到主机名:2610:130:101:104::2
* 无法解析主机:2610:130:101:104::2

我在这里做错了什么?

(Curl 是 7.56.1 版本)

【问题讨论】:

    标签: libcurl ipv6


    【解决方案1】:

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

    这已在 curl 7.58.0 中得到解决,从那时起,如果尝试这样做,它会使 libcurl 返回错误!

    【讨论】:

      【解决方案2】:

      答案:Curl 库是在不支持 IPv6 的情况下构建的。

      我认为这可能会导致更有意义的错误消息。

      【讨论】:

      • 已提交错误报告。
      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 2012-02-08
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多