将 CURLOPT_CONNECT_TO 与 IPv6 地址一起使用
Using CURLOPT_CONNECT_TO with an IPv6 address
我正在尝试使用 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 主机查找:
DEBUG: connect '::129.186.23.166:', url http://www.iastate.edu/
* Connecting to hostname: 129.186.23.166
* Trying 129.186.23.166...
* TCP_NODELAY set
* Connected to 129.186.23.166 (129.186.23.166) port 80 (#0)
对
DEBUG: connect '::[2610:130:101:104::2]:', url http://www.iastate.edu/
* Connecting to hostname: 2610:130:101:104::2
* Could not resolve host: 2610:130:101:104::2
我做错了什么?
(Curl 是版本 7.56.1)
答案:已构建 Curl 库w/o IPv6 支持。
我想也许这应该会导致更有意义的错误消息。
libcurl(7.58.0 之前)中存在一个错误,导致它获取 IPv6 地址并尝试将它们用于 CURLOPT_CONNECT_TO,即使它是在不支持 IPv6 的情况下构建的!
这在 curl 7.58.0 中得到解决,从那时起,如果尝试这样做,它会使 libcurl return 出错!
我正在尝试使用 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 主机查找:
DEBUG: connect '::129.186.23.166:', url http://www.iastate.edu/
* Connecting to hostname: 129.186.23.166
* Trying 129.186.23.166...
* TCP_NODELAY set
* Connected to 129.186.23.166 (129.186.23.166) port 80 (#0)
对
DEBUG: connect '::[2610:130:101:104::2]:', url http://www.iastate.edu/
* Connecting to hostname: 2610:130:101:104::2
* Could not resolve host: 2610:130:101:104::2
我做错了什么?
(Curl 是版本 7.56.1)
答案:已构建 Curl 库w/o IPv6 支持。
我想也许这应该会导致更有意义的错误消息。
libcurl(7.58.0 之前)中存在一个错误,导致它获取 IPv6 地址并尝试将它们用于 CURLOPT_CONNECT_TO,即使它是在不支持 IPv6 的情况下构建的!
这在 curl 7.58.0 中得到解决,从那时起,如果尝试这样做,它会使 libcurl return 出错!