2017-09-07 6 views
1

J'ai le problème suivant. J'utilise Embarcadero Rad Studio 10.1 Berlin Firemonkey. Je veux me connecter à un serveur POP3 dans un réseau IPv6 où IPv4 n'est pas activé et j'obtiens l'erreur d'erreur de socket # 11004. Mon code est:Embarcadero Rad Studio Firemonkey Erreur de socket POP3 IPv6 Indy 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); 
} 

Si j'utilise l'application dans un réseau IPv4, puis après avoir connecté la propriété IPVersion est réglé sur Id_IPv4 automatiquement et il n'y a pas de problème.

chose intéressante est que le code suivant fonctionne dans le réseau IPv6:

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

Toute suggestion?

Répondre

0

Vous devez définir la propriété pop3->IPVersion (qui est héritée de TIdTCPClient) au lieu de la propriété iOHandlerStack->IPVersion directement. Remplace la valeur de propriété IPVersion de IOHandler par la valeur de propriété de couche supérieure TIdTCPClient::IPVersion. Donc, si vous laissez pop3->IPVersion à sa valeur par défaut Id_IPv4, cela expliquerait pourquoi vous ne pouvez pas vous connecter en utilisant IPv6. Et pourquoi votre exemple TIdTCPClient fonctionne.

De même, vous n'avez pas besoin de définir la propriété iOHandlerStack->Port manuellement, Connect() gère également.

+0

Le problème est que la propriété IPVersion du composant TIdPOP3 est protégée, c'est pourquoi j'ai utilisé iohandler. – Ferenc

+0

@Ferenc il ne devrait pas être protégé dans les descendants. Je réparerai ça quand j'aurai une chance. En attendant, vous pouvez utiliser une classe d'accès pour promouvoir la propriété: 'classe TIdPOP3Access: public TIdPOP3 {public: __property IPVersion; } ((TIdPOP3Access *) pop3) -> IPVersion = Id_IPv6; ' –

+0

@Ferenc J'ai ouvert un ticket dans le programme de suivi des problèmes d'Indy pour cela: [Promouvoir la propriété IPVersion dans les clients TCP] (https://github.com/IndySockets/Indy/ issues/184) –