2013-03-01 95 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