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() обрабатывает это также.

Другие вопросы по тегам