Embarcadero Rad Studio Firemonkey Indy POP3 Ошибка IPv6 сокета 11004
У меня следующая проблема. Я использую Embarcadero Rad Studio 10.1 Berlin Firemonkey. Я хочу подключиться к серверу POP3 в сети IPv6, где IPv4 не включен, и я получаю ошибку сокета error # 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");
Любое предложение?
1 ответ
Вам нужно установить pop3->IPVersion
свойство (которое наследуется от TIdTCPClient
) вместо iOHandlerStack->IPVersion
собственность напрямую.
Connect()
переопределяет IOHandler's IPVersion
значение свойства с верхним слоем TIdTCPClient::IPVersion
стоимость имущества.
Итак, если вы уходите pop3->IPVersion
к значению по умолчанию Id_IPv4
, это объясняет, почему вы не можете подключиться с помощью IPv6. А почему твой TIdTCPClient
пример работает.
Кроме того, вам не нужно устанавливать iOHandlerStack->Port
собственность вручную, Connect()
обрабатывает это также.