如何配置Indy v10以支持IPv4 + IPv6?

Cas*_*ady 10 delphi indy indy10

使用以下代码,我可以获得IPv4网站的内容:

uses 
  IdHttp;

IdHttp1 := TIdHttp.Create(nil);
try
  Result := IdHttp1.Get('http://www.heise.de/')
finally
  IdHttp1.Free;
end;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试连接到IPv6网站时,我收到套接字错误#11004:

IdHttp1 := TIdHttp.Create(nil);
try
  Result := IdHttp1.Get('http://www.six.heise.de/')
finally
  IdHttp1.Free;
end;
Run Code Online (Sandbox Code Playgroud)

我可以ping www.six.heise.de就好了(IP 2a02:2e0:3fe:100 :: 6 :)并且Firefox显示网站没有问题.

我需要在Indy(SVN的最新V10版本)中更改以连接到IPv4和IPv6网站吗?

Rem*_*eau 11

TIdTCPClient需要告知是否使用IPv4或IPv6作为其套接字和主机名到IP的解析.这是使用该TIdTCPClient.IPVersion属性完成的.但是,这TIdHTTP是一种特殊情况,因为它在TIdTCPClient内部管理属性和连接,包括IPVersion. TIdHTTP设置IPVersion基于被请求的URL.要请求包含IPv6主机名的URL,需要将其括在括号中,例如:

Result := IdHttp1.Get('http://[www.six.heise.de]/')
Run Code Online (Sandbox Code Playgroud)

  • 现在,您可以使用`TIdDNSResolver`对主机名进行手动DNS查找,然后使用带有适当格式化URL的`TIdHTTP`. (4认同)
  • 根据[RFC 2732](http://tools.ietf.org/html/rfc2732),URL中使用的IPv6地址必须置于括号内.主机名没有,但是`TIdHTTP`目前没有其他方法可以提前知道何时使用IPv4与IPv6.当webbrowser连接到URL时,它会通过DNS解析主机名以获取其可用的IPv4/IPv6地址,然后尝试连接它们直到成功.`TIdTCPClient`在设置`IPVersion`并创建了IPv4/IPv6套接字后解析主机名.它不会尝试连接到多个IP.这可能需要在将来改变. (2认同)