Форум: "Сети";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизIndy idFTP - как определить, что соединение разорвано? Найти похожие ветки
← →
Puzzle (2003-03-26 18:43) [0]Использую Indy9 компонент TidFTP.
Как определить, что связь разорвана по таймауту сервером или по
какой-либо другой причине?
Свойство TidFTP.Connected возвращает True, даже когда связи уже нет.
CheckForDisconnect не использую, т.к. при вызове Connected эта процедура там используется.
Событие OnStatus не срабатывает при обрыве соединения.
Метод Status также ничего полезного не делает.
На первый взгляд кажется, что проблема проста, но...
← →
Zelius (2003-03-26 21:58) [1]А ты присваиваешь ReadTimeout? Если нет, то это означает анлимитед ожидание и в некторых случаях виснет надолго, если не на всегда!
← →
Shuric (2003-03-27 00:21) [2]Иногда полезно послать мусор и посмотреть сколько действительно отправлено ;)
← →
Puzzle (2003-03-28 14:00) [3]Я что-то не совсем доехал как юзать ReadTimeout. Если не трудно, расскажите на пальцах, по-русски, как хотите, главное чтобы понятно было.
← →
$hade (2003-03-28 15:48) [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 16:46) [5]понятно, попробую, если что черкну
спасибо
← →
Puzzle (2003-03-31 13:22) [6]> $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 надо не по таймеру делать? Тогда где и как?
← →
$hade (2003-03-31 16:04) [7]хбз...под конец рабочего дня я уже с трудом соображаю...
для начала сделай так:
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 надо не по таймеру делать?
лучше в отдельном потоке...
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c