Подходит ли Indy TIdTCPClient для локальных подключений TCP / IP?
-
14-11-2019 - |
Вопрос
Мне нужно подключиться к устройству в локальной сети, используя соединение TCP / IP.Когда я использую TIdTCPClient, все работает хорошо, за исключением одной вещи:
Если соединение недоступно, пройдет около 18-20 секунд, прежде чем я получу тайм-аут.Свойство ConnectTimeout не имеет никакого эффекта, независимо от того, какие значения я установил.Это всегда занимает одинаковое количество времени до истечения тайм-аута.
Этот ответ упоминает длительное время задержки для таймаута, и мне интересно, связано ли это с компонентами Indy?
Я должен выяснить, не может ли соединение быть установлено очень быстро, скажем, максимум в течение 1 секунды.
Есть ли способ сделать это с помощью Indy, или мне нужно использовать другие компоненты / другой подход?
(Я использую версию Indy 10, поставляемую вместе с Delphi 2009)
Редактировать:
Я следовал инструкциям по обновлению Indy до последней версии в этот пост.
Все то же самое, теперь время до получения TcpClient неизменно занимает 22 секунды.Подключение возвращается, когда соединение отсутствует.ConnectTimeout и / или ReadTimeout, похоже, не оказывают на это никакого влияния.
Решение
У меня была точно такая же проблема.Проверьте этот пост StackOverflow.
Короче говоря, поскольку потоки Indy блокируются, вам нужно будет создать многопоточный процесс.Затем в основном приложении создайте таймер, который завершит поток, если он не выполнил то, что должен был сделать за заданное время.
После того, как я внедрил это, все отлично сработало.
Другие советы
ConnectTimeout корректно работает для 2010 и XE.Возможно, вы сможете обновить свою версию Indy до последней (она бесплатна).У меня есть функция, которая выполняет "быструю проверку" подключений, просто чтобы проверить доступность устройства, и эти тайм-ауты составляют 5 секунд без проблем (как в 2010, так и в XE).
При таймауте подключения TCP-клиента по умолчанию (специально не заданном) и таймауте чтения в 1 секунду, использующем Delphi 2010 и последнюю версию Indy, время ожидания локального соединения (с использованием localhost в качестве имени хоста) истекает через 1 секунду.Так что это определенно не проблема Delphi / Indy.Кстати, это выдает мне EIdSocketError ("ошибка сокета # 10061 отказано в подключении").