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()
也可以处理。
我有以下问题。我使用 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()
也可以处理。