![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Indy idFTP - как определить, что соединение разорвано? [D5, Win2k]
Puzzle © (2003-03-26 18:43:00)Использую Indy9компонент TidFTP.
Как определить, что связь разорвана по таймауту сервером или по
какой-либо другой причине?
Свойство TidFTP.Connectedвозвращает True, даже когда связи уже нет.
CheckForDisconnectне использую, т.к. при вызове Connected эта процедура там используется.
Событие OnStatusне срабатывает при обрыве соединения.
Метод Statusтакже ничего полезного не делает.
На первый взгляд кажется, что проблема проста, но...
$hade (2003-03-31 16:04:00) [1]хбз...под конец рабочего дня я уже с трудом соображаю...
для начала сделай так:
var B: array [1..3] of Char;
begin
Timer.Enabled:=false; <<<<<<
if FTP.Connected then try
FTP.ReadBuffer(b, 1);
except
meLog.Lines.Add("НЕТ СОЕДИНЕНИЯ");
end;
Timer.Enabled:=true; <<<<<<
end;
2: после того, как я жду 5 минут
или секунд? в твоем случае каждые 10 секунд будет выдоваться
"нет соединения" хотя на самом деле это "таймаут чтения"
3: сообщение "НЕТ СОЕДИНЕНИЯ" появляется раз 10
еще раз - "нет соединения" будет выводиться при ЛЮБОЙ ошибке
в блоке между try/except
4:Может быть ReadBuffer надо не по таймеру делать?
лучше в отдельном потоке...
Puzzle (2003-03-31 13:22:00) [2]> $hade, есть вопрос. Делаю, как ты посоветовал, т.е. таймеру, у которого интервал 5 сек, на событие OnTimerвписао следующий код:
procedure TfmMain.TimerEventTimer(Sender: TObject);
var B: array [1..3] of Char;
begin
if FTP.Connected then try
FTP.ReadBuffer(b, 1);
except
meLog.Lines.Add("НЕТ СОЕДИНЕНИЯ");
end;
end;
у idFTP выставил ReadTimeout=10000.
Но происходит следующее: после того, как я жду 5 минут, а потом делаю какое-либо действие (например RetrieveCurrentDir), то сообщение "НЕТ СОЕДИНЕНИЯ" появляется раз 10. Почему так происходит?
Может быть ReadBuffer надо не по таймеру делать? Тогда где и как?
Puzzle (2003-03-28 16:46:00) [3]понятно, попробую, если что черкну
спасибо
$hade (2003-03-28 15:48:00) [4]Я что-то не совсем доехал как юзать ReadTimeout
ReadTimeout :=10000
try
ReadBuffer(b,5)
except
on e:EIdReadTimeOut{вроде так оно называется} do
begin
{тут делаещ что-либо при таймауте}
end;
end;
работает оч просто: Indy - блокирующие сокеты - то есть выполнение проги на строке ReadBuffer(b,5) остановится и сокет будет ждать до тех пор пока не прийдут 5 байт данных....или
не пройдет 10 секунед (таймаут) и тогда пройсходит исключение EIdReadTimeOut...
Puzzle (2003-03-28 14:00:00) [5]Я что-то не совсем доехал как юзать ReadTimeout. Если не трудно, расскажите на пальцах, по-русски, как хотите, главное чтобы понятно было.
Shuric (2003-03-27 00:21:00) [6]Иногда полезно послать мусор и посмотреть сколько действительно отправлено ;)
Zelius (2003-03-26 21:58:00) [7]А ты присваиваешь ReadTimeout? Если нет, то это означает анлимитед ожидание и в некторых случаях виснет надолго, если не на всегда!