Вам не нужно вручную устанавливать ConnectTimeout
и ReadTimeout
на самом IOHandler, только на клиентском компоненте (в данном случае TIdHTTP
). TIdTCPClient.Connect()
назначит значения для IOHandler для вас.
ConnectTimeout
применяется, когда базовый сокет подключается к серверу, до создания любого сеанса SSL / TLS, поэтому он работает одинаково, независимо от того,вы используете SSL / TLS или нет.
ReadTimeout
применяется, когда Indy пытается прочитать байты из внутреннего соединения IOHandler. Когда SSL / TLS не используется, это означает, что он идет прямо в сокет и, таким образом, время ожидания истекает, когда в сокет не поступает никаких байтов. Но при использовании SSL / TLS Indy использует устаревшие SSL_...()
API-интерфейсы OpenSSL, а не более новые BIO_...()
API-интерфейсы, что означает, что OpenSSL выполняет собственное чтение сокетов и буферизацию от имени Indy, и, таким образом, тайм-аут Indy, когда OpenSSL не предоставляет никакихдешифрованные байты приложения.
Разница в том, как TIdSSLIOHandlerSocketOpenSSL
работает на Windows по сравнению с другими платформами, состоит в том, что только на Windows Vista + TIdSSLIOHandlerSocketOpenSSL
применяет ReadTimeout
к базовым сокетам SO_RCVTIMEO
и SO_SNDTIMEO
тайм-ауты с помощью метода IOHandler Binding.SetSockOpt()
, как обходной путь к ошибке OpenSSL в Windows. Для других платформ Indy в настоящее время не устанавливает эти два тайм-аута.
Хорошим местом для установки этих тайм-аутов вручную было бы событие IOHandler OnBeforeConnect
, которое вызывается после подключения сокета к серверу идо создания любого сеанса SSL / TLS.