2013-03-01 48 views
10

用下面的代码,我可以得到一个IPv4网站的内容:如何配置Indy v10以支持IPv4 + IPv6?

uses 
    IdHttp; 

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

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

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

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

Indy(SVN最新的V10版本)需要更改什么来连接IPv4和IPv6网站?

回答

11

TIdTCPClient需要知道是否使用IPv4或IPv6作为其套接字和主机名称到IP分辨率。这是使用TIdTCPClient.IPVersion属性完成的。但TIdHTTP是一种特殊情况,因为它在内部管理TIdTCPClient属性和连接,包括IPVersionTIdHTTP根据请求的URL设置IPVersion。为了请求包含IPv6主机名的URL,它需要被包裹在括号中,如:

Result := IdHttp1.Get('http://[www.six.heise.de]/') 
+0

这工作,但它是一个比较奇怪的解决方案,如网络浏览器将不接受HTTP:// [WWW .six.heise.de] /。有没有一种方法来确定一个网站是否是ipv4或ipv6,并且在ipv6的情况下将括号添加到URL中? – Casady 2013-03-01 21:50:23

+2

根据[RFC 2732](http://tools.ietf.org/html/rfc2732),URL中使用的IPv6地址必须加括号。主机名不是,但是“TIdHTTP”目前没有其他方式提前知道何时使用IPv4 vs IPv6。当浏览器连接到URL时,它通过DNS解析主机名以获取其可用的IPv4/IPv6地址,然后尝试连接到它们直到成功。 'IPVersion'已设置并且已创建IPv4/IPv6套接字后,'TIdTCPClient'解析主机名。它不会尝试连接到多个IP。这可能在未来需要改变。 – 2013-03-01 22:08:19

+4

现在,您可以使用'TIdDNSResolver'在使用具有适当格式的URL的'TIdHTTP'之前对主机名进行手动DNS查找。 – 2013-03-01 22:11:11