Delphi Indy - Eidconnclosed изящно делает сокет непригодным для использования - PullRequest
7 голосов
/ 28 ноября 2011

Сценарий:

Delphi 2010 работает под управлением последней версии Indy из ствола SVN.

У меня есть приложение, которое использует idHTTP для отправки http-запросов. Этот idHTTP создается только один раз и хранится в памяти до тех пор, пока приложение работает. Я отправляю множество веб-запросов на один и тот же http-сервер (который также является приложением, разработанным мной).

Я использую keep-alive, чтобы держать сокет подключенным.

После нескольких запросов я получаю EIdConnClosedGracefully на стороне клиента, и не важно, что я делаю после того, как получаю это исключение, каждый последующий запрос к тому же серверу генерирует одно и то же исключение .

Я попытался отключить, закрыть сокет, очистить буфер IOHandler и ничего не получалось.

Если я уничтожу объект IdHttp и воссоздаю его после возникновения исключения, все работает нормально. Но это не то, чего я хочу, потому что мне нужно постоянно подключаться к серверу (чтобы избежать TIME_WAITS и т. Д.).

Кто-нибудь знает, как обрабатывать EIdConnClosedGracefully исключение на стороне клиента и заставить idHttp работать после того, как это исключение возникает?

EDIT

Я разработал веб-сервер сам, и я уверен, что не отключаюсь после запроса клиента. Я знаю, что это исключение в порядке, , но что не в порядке, так это то, что сокет стал непригодным для использования после этого . Indy должен восстановиться после этого исключения, отсоединив сокет и подключив его при необходимости. Как я уже сказал, это исключение показывается пользователю не только в Delphis IDE. Что мне действительно нужно, так это способ получения этого исключения, я должен иметь возможность продолжать использовать этот сокет. -

1 Ответ

7 голосов
/ 29 ноября 2011

Звоните TIdHTTP.Disconnect(False) и TIdHTTP.IOHandler.InputBuffer.Clear() - все, что вам нужно для восстановления.

...