2013-03-01 29 views
10

z następującego kodu można uzyskać zawartość na stronie IPv4:Jak skonfigurować Indy v10 do obsługi IPv4 + IPv6?

uses 
    IdHttp; 

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

ale gdy próbuję połączyć się z witryny IPv6 uzyskać Socket Error # 11004:

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

mogę ping www.six.heise.de just fine (IP 2a02: 2e0: 3fe: 100 :: 6 :) a Firefox wyświetla stronę bez problemów.

Co muszę zmienić w Indy (najnowsza wersja V10 z SVN), aby połączyć się ze stronami IPv4 i IPv6?

Odpowiedz

11

TIdTCPClient należy poinformować, czy używać IPv4 lub IPv6 dla jego gniazd i rozdzielczości hostname-to-IP. Dokonuje się tego za pomocą właściwości TIdTCPClient.IPVersion. Jednak TIdHTTP jest szczególnym przypadkiem, ponieważ zarządza własnymi i wewnętrznymi połączeniami TIdTCPClient, w tym IPVersion. TIdHTTP ustawia IPVersion na podstawie żądanego adresu URL. Aby dokona URL zawierający nazwę hosta IPv6, musi być opakowane w nawiasie, np:

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

To działa, ale jest dość dziwne rozwiązanie, ponieważ przeglądarka nie akceptuje http: // [www .six.heise.de] /. Czy istnieje sposób na określenie, czy strona internetowa to ipv4 czy ipv6, aw przypadku ipv6 dodać nawiasy do adresu URL? – Casady

+2

Adresy IPv6 używane w adresach URL muszą być nawiasami, według [RFC 2732] (http://tools.ietf.org/html/rfc2732). Nazwy hostów nie, ale 'TIdHTTP' obecnie nie ma innego sposobu, aby wiedzieć z wyprzedzeniem, kiedy używać IPv4 vs IPv6. Kiedy przeglądarka internetowa łączy się z adresem URL, rozwiązuje nazwę hosta za pośrednictwem systemu DNS, aby uzyskać dostępne adresy IPv4/IPv6, a następnie próbuje się połączyć z nimi, dopóki jedna się nie powiedzie. 'TIdTCPClient' rozwiązuje nazwę hosta po ustawieniu' IPVersion' i utworzeniu gniazda IPv4/IPv6. Nie próbuje połączyć się z wieloma adresami IP. To może się zmienić w przyszłości. –

+4

Na razie możesz użyć 'TIdDNSResolver' do ręcznego sprawdzenia DNS nazwy hosta przed użyciem' TIdHTTP' z odpowiednio sformatowanym adresem URL. –