Подходит ли Indy TIdTCPClient для локальных подключений TCP / IP?

StackOverflow https://stackoverflow.com/questions/5005607

Вопрос

Мне нужно подключиться к устройству в локальной сети, используя соединение 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 отказано в подключении").

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top