2017-09-07 2 views
1

다음과 같은 문제가 있습니다. 나는 Embarcadero Rad Studio 10.1 Berlin Firemonkey를 사용합니다. IPv4가 활성화되어 있지 않은 IPv6 네트워크에서 POP3 서버에 연결하고 소켓 오류 # 11004 오류가 발생합니다. 내 코드는 다음과 같습니다Embarcadero Rad Studio Firemonkey Indy POP3 IPv6 소켓 오류 11004

int port = 110; 
pop3->Host = ... 
pop3->Username = ... 
pop3->Password = .. 
pop3->AuthType = patUserPass; 
pop3->IOHandler = iOHandlerStack; 
iOHandlerStack->IPVersion = TIdIPVersion::Id_IPv6; 
pop3->UseTLS = utNoTLSSupport; 
pop3->Port = port; 
iOHandlerStack->Port = port; 
try 
{ 
    pop3->ConnectTimeout = 5000; 
    pop3->Connect(); 
    int msgc = pop3->CheckMessages(); 
    pop3->Disconnect(); 
    ShowMessage("OK: " + IntToStr(msgc)); 
} 
catch (Exception &exc) 
{ 
    ShowMessage(exc.Message); 
} 

내가 자동으로 Id_IPv4로 설정되어 IPVersion 속성을 연결 한 후 다음 IPv4 네트워크 내에서 응용 프로그램을 사용해도 아무 문제가없는 경우.

흥미로운 점은 다음과 같은 코드가 IPv6 네트워크 내에서 작동한다는 것입니다 :

IdTCPClient->IPVersion = TIdIPVersion::Id_IPv6; 
IdTCPClient->Host = ... 
IdTCPClient->Port = 80; 
IdTCPClient->Connect(); 
IdTCPClient->Disconnect(); 
ShowMessage("OK"); 

어떤 제안?

답변

0

iOHandlerStack->IPVersion 속성 대신 pop3->IPVersion 속성 (TIdTCPClient에서 상속 됨)을 직접 설정해야합니다.

Connect()은 IOHandler의 IPVersion 속성 값을 상위 계층 TIdTCPClient::IPVersion 속성 값으로 대체합니다.

따라서 pop3->IPVersion을 기본값 인 Id_IPv4으로두면 IPv6을 사용하여 연결할 수없는 이유가 설명됩니다. 그리고 귀하의 TIdTCPClient 예제가 작동하는 이유는 무엇입니까?

또한 iOHandlerStack->Port 속성을 수동으로 설정할 필요가 없으며 Connect()도 그 속성을 처리합니다.

+0

문제는 TIdPOP3 구성 요소의 IPVersion 속성이 보호된다는 것입니다. 이것이 iohandler를 사용하는 이유입니다. – Ferenc

+0

@Ferenc 그것은 자손에서 보호되어서는 안됩니다. 나는 기회가 생길 때 그것을 고칠 것이다. 그 동안 액세스 클래스를 사용하여 속성을 홍보 할 수 있습니다.'class TIdPOP3Access : public TIdPOP3 {public : __property IPVersion; }; (TIdPOP3Access *) pop3) -> IPVersion = Id_IPv6; ' –

+0

@Ferenc Indy의 이슈 추적기에 [TCP 클라이언트의 IPVersion 속성 올리기] (https://github.com/IndySockets/Indy/) 티켓을 열었습니다. 이슈/184) –

관련 문제