2013-03-01 14 views
10

Mit folgendem Code kann ich den Inhalt einer IPv4-Website erhalten:Wie konfiguriere ich Indy v10 zur Unterstützung von IPv4 + IPv6?

uses 
    IdHttp; 

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

aber wenn ich versuche, eine IPv6-Website zu verbinden I Sockel Error # 11004 erhalten:

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

Ich kann ping www.six.heise.de geht es gut (IP 2a02: 2e0: 3fe: 100 :: 6 :) und Firefox zeigt die Website ohne Probleme an.

Was muss ich in Indy ändern (neuester V10-Build von SVN), um sowohl IPv4- als auch IPv6-Websites zu verbinden?

Antwort

11

TIdTCPClient muss angegeben werden, ob IPv4 oder IPv6 für seine Socket- und Hostname-zu-IP-Auflösungen verwendet werden soll. Dies geschieht mit der Eigenschaft TIdTCPClient.IPVersion. TIdHTTP ist jedoch ein Sonderfall, weil es die TIdTCPClient Eigenschaften und Verbindung intern verwaltet, einschließlich der IPVersion. TIdHTTP setzt die IPVersion basierend auf der angeforderten URL. Um eine URL enthält einen IPv6-Hostnamen zu beantragen, muss er in Klammern eingewickelt werden, zB:

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

Dies funktioniert, aber ist eine ziemlich seltsame Lösung, wie ein Web-Browser http nicht akzeptieren: // [www .six.heise.de] /. Gibt es eine Möglichkeit, zu dementieren, ob eine Website ipv4 oder ipv6 ist, und im Fall von ipv6 die Klammern zur URL hinzufügen? – Casady

+2

IPv6-Adressen, die in URLs verwendet werden, müssen nach [RFC 2732] (http://tools.ietf.org/html/rfc2732) geklammert werden. Hostnamen nicht, aber 'TIdHTTP' hat derzeit keine andere Möglichkeit zu wissen, wann IPv4 gegen IPv6 zu verwenden ist. Wenn ein Webbrowser eine Verbindung zu einer URL herstellt, löst er den Hostnamen über DNS auf, um die verfügbaren IPv4/IPv6-Adressen abzurufen, und versucht dann, eine Verbindung zu ihnen herzustellen, bis einer erfolgreich ist. 'TIdTCPClient' löst den Hostnamen auf, nachdem' IPVersion' gesetzt wurde und ein IPv4/IPv6-Socket erstellt wurde. Es versucht nicht, eine Verbindung zu mehreren IPs herzustellen. Das muss sich in Zukunft ändern. –

+4

Vorläufig können Sie 'TIdDNSResolver' verwenden, um eine manuelle DNS-Suche nach dem Hostnamen durchzuführen, bevor Sie' TIdHTTP' mit einer entsprechend formatierten URL verwenden. –