Подходит ли Indy TIdTCPClient для локальных соединений TCP / IP? - PullRequest
0 голосов
/ 15 февраля 2011

Мне нужно подключиться к устройству в локальной сети, используя соединение TCP / IP.Когда я использую TIdTCPClient, все работает хорошо, кроме одной вещи:

Если соединение недоступно, пройдет около 18-20 секунд, прежде чем я получу тайм-аут.Свойство ConnectTimeout не оказывает никакого влияния, независимо от того, какие значения я установил.До истечения времени ожидания всегда одинаковое количество времени.

В этом ответе упоминаются длительные времена задержки для времени ожидания, и мне интересно, связано ли это с компонентами Indy?

Я должен выяснить, не может ли соединение быть установлено очень быстро, скажем, не более чем за 1 секунду.

Есть ли способ сделать это с помощью Indy, или мне нужно использовать разные компоненты / aдругой подход?

(я использую версию Indy 10, поставляемую с Delphi 2009)

EDIT :
Я следовал инструкциям по обновлению Indy допоследняя версия в в этом сообщении .

Тем не менее, теперь постоянно используется 22 секунды, пока не возвращается TCPClient.Connect, когда нет соединения.ConnectTimeout и / или ReadTimeout, похоже, не влияют на это.

Ответы [ 3 ]

5 голосов
/ 15 февраля 2011

ConnectTimeout работает правильно для 2010 и XE. Возможно, вы сможете обновить свою версию Indy до последней (бесплатной). У меня есть функция, которая выполняет «быструю проверку» подключений, просто для проверки доступности устройства, и эти таймауты без проблем составляют 5 секунд (как в 2010, так и в XE).

2 голосов
/ 16 февраля 2011

При установленном по умолчанию тайм-ауте соединения с TCP-клиентом (не установлено) и тайм-ауте чтения 1 секунда, при использовании Delphi 2010 и последней версии Indy, локальное соединение (с использованием localhost в качестве имени хоста) истекает через 1 секунду. Так что это определенно не проблема Delphi / Indy. Кстати, это дает мне EIdSocketError («ошибка сокета # 10061 отказано в соединении»).

1 голос
/ 15 февраля 2011

У меня была точно такая же проблема. Проверьте это сообщение StackOverflow .

Короче говоря, поскольку потоки Indy блокируются, вам потребуется выполнить многопоточный процесс. Затем в основном приложении создайте таймер, который прервет поток, если он не выполнил то, что должен был сделать в указанное время.

После того, как я реализовал это отлично работает.

...