代码之家  ›  专栏  ›  技术社区  ›  John Hascall

使用具有IPv6地址的CURLOPT\u CONNECT\u TO

  •  1
  • John Hascall  · 技术社区  · 7 年前

    我正在尝试使用curl的CURLOPT\u CONNECT\u 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\u INET和 ipAddrSring 是一个IPv4地址,它工作得很好。什么时候 自动对焦 是AF\U INET6和 IP地址 是IPv6地址,curl似乎正在尝试对IPv6地址执行DNS主机查找:

    调试:连接“::129.186.23.166:”,url http://www.iastate.edu/
    *连接到主机名:129.186.23.166
    *正在尝试129.186.23.166。。。
    *TCP\U节点集
    *连接到129.186.23.166(129.186.23.166)端口80(#0)

    vs公司

    调试:连接“::[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 回复  |  直到 7 年前
        1
  •  2
  •   Daniel Stenberg    6 年前

    libcurl(7.58.0之前)中存在一个bug,使得它获取IPv6地址并尝试将其用于CURLOPT\u CONNECT\u to,即使它是在不支持IPv6的情况下构建的!

    这在curl 7.58.0中得到了解决,从那时起,如果尝试这样做,libcurl将返回一个错误!

        2
  •  0
  •   John Hascall    7 年前

    答:构建的Curl库不支持IPv6。

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