Embarcadero Rad Studio Firemonkey Indy POP3 IPv6 套接字错误 11004

Embarcadero Rad Studio Firemonkey Indy POP3 IPv6 socket error 11004

我有以下问题。我使用 Embarcadero Rad Studio 10.1 Berlin Firemonkey。我想连接到未启用 IPv4 的 IPv6 网络中的 POP3 服务器,但出现套接字错误 #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);
}

如果我在 IPv4 网络中使用该应用程序,那么在连接 IPVersion 属性 后自动设置为 Id_IPv4 并且没有问题。

有趣的是以下代码在 IPv6 网络中工作:

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

有什么建议吗?

您需要设置pop3->IPVersion 属性(继承自TIdTCPClient)而不是直接设置iOHandlerStack->IPVersion 属性。

Connect() 用更高层 TIdTCPClient::IPVersion 属性 值覆盖 IOHandler 的 IPVersion 属性 值。

因此,如果您将 pop3->IPVersion 保留为其默认值 Id_IPv4,这就可以解释为什么您无法使用 IPv6 进行连接。以及为什么您的 TIdTCPClient 示例有效。

此外,您不需要手动设置 iOHandlerStack->Port 属性,Connect() 也可以处理。