2013-03-01 1 views
10

I는 IPv4 웹 사이트의 콘텐츠를 얻을 수 있습니다 :IPv4 + IPv6을 지원하도록 Indy v10을 구성하는 방법은 무엇입니까? 다음 코드와

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는 문제없이 웹 사이트를 표시합니다.

IPv4와 IPv6 웹 사이트에 모두 연결하려면 Indy (최신 V10은 SVN에서 빌드해야 함)에서 변경해야 할 사항은 무엇입니까?

답변

11

TIdTCPClient은 소켓 및 호스트 이름 - IP 해상도에 IPv4 또는 IPv6을 사용할지 여부를 알려야합니다. 이는 TIdTCPClient.IPVersion 속성을 사용하여 수행됩니다. 그러나 TIdHTTPIPVersion을 포함하여 TIdTCPClient 속성과 연결을 내부적으로 관리하기 때문에 특별한 경우입니다. TIdHTTP은 요청중인 URL을 기반으로 IPVersion을 설정합니다. 의 IPv6 호스트 이름을 포함하는 URL을 요청하기 위해서는, 괄호에 싸여 될 필요 예 :

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

웹 브라우저에 http를 허용하지 않으므로이 오히려 이상한 솔루션을 작동하지만입니다 : // [WWW를 .six.heise.de] /. 웹 사이트가 ipv4 또는 ipv6인지 여부를 결정할 수있는 방법이 있습니까? ipv6의 경우 URL에 대괄호를 추가 하시겠습니까? – Casady

+2

URL에 사용되는 IPv6 주소는 [RFC 2732] (http://tools.ietf.org/html/rfc2732)에 따라 대괄호로 묶어야합니다. 호스트 명은 그렇지 않지만, 'TIdHTTP'는 현재 IPv4와 IPv6를 사용할 때를 미리 알 수있는 다른 방법이 없습니다. 웹 브라우저가 URL에 연결하면 DNS를 통해 호스트 이름을 확인하여 사용 가능한 IPv4/IPv6 주소를 얻은 다음 성공할 때까지 연결을 시도합니다. 'TIdTCPClient'는'IPVersion'이 설정되고 IPv4/IPv6 소켓이 생성 된 후에 호스트 이름을 결정합니다. 여러 개의 IP에 연결을 시도하지 않습니다. 그것은 미래에 변화해야 할 수도 있습니다. –

+4

지금은 'TIdDNSResolver'를 사용하여 적절한 형식의 URL로'TIdHTTP'를 사용하기 전에 호스트 이름을 수동으로 DNS 조회 할 수 있습니다. –

관련 문제