![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Indy 10 и отлов ошибок
Pavel Kuznecov © (2007-03-29 09:17:00)Всем привет!
Подскажите как отловить сообщения об ошибках в Indy(10) ?
Ситуация такая:
Передаю некоторую информацию поTIdTCPClient(IOHandler.Write)с переодичностью 10сек.
Данные идут через Интернет(vpn). НО если разорвать соединение VPN, то всплывает ошибка "10054
Connection reset by peer"
***
В TcpClient я бы словил OnError и все., Но в Инди такого нету :(
Поможете?
Буду благодарен за любую помощь!
(BDS2006,Indy10,WinSer 2003)
Anatoly Podgoretsky (2007-03-29 23:07:00) [1]> Pavel Kuznecov (29.03.2007 13:22:18) [18]
Как это без разницы?
Шутишь?
Anatoly Podgoretsky (2007-03-29 23:06:00) [2]> Pavel Kuznecov (29.03.2007 12:22:16) [16]
А теперь вытащи кабель после энного маршрутизатора.
То что ты пишешь является функцией сетевой платы и срабатывает только на кабель присоединеный к ней
Anatoly Podgoretsky (2007-03-29 23:04:00) [3]> Pavel Kuznecov (29.03.2007 11:54:10) [10]
Момент разрыва не является ошибкой.
Ошибкой является не получения отклика от сервера
Сергей М. (2007-03-29 13:32:00) [4]
> На счет с какой стороны: да без разницы
Тебе так только кажется. Разница естьи весьма ощутимая.
> соединение прямое PC-PC
Это только частный случай.
> Ну делаю я чрез Инди. Нужно словить обрыв
Сказка про белого бычка)
Обрыв, еще раз повторяю, вполне может произойти на стороне партнера, и никаких извещений об этом обрыве ты не получишь - спасет тольколовля исключения при выполнении приема/передачи. И это и есть универсальныйспособ определения разрыва соединения по любымпричинам.
Pavel Kuznecov (2007-03-29 13:22:00) [5]на счет мух: ну это ж пример. просто пример.
На счет Инди: Ну делаю я чрез Инди. Нужно словить обрыв.
На счет с какой стороны: да без разницы. представьте, что соединение прямое PC-PC.
Сергей М. (2007-03-29 12:57:00) [6]
> Выньте кабель на пол секунды, вы сразу увидите о потерянном
> соединении.
> КАК?
Ну все в одну кучу - и мухи, и котлеты)
Инди-то тут причем ?
И на какой стороне ты "вынимаешь кабель" - на своей или на стороне партнера ? Это в ряде случаев оченьважно !
Pavel Kuznecov (2007-03-29 12:22:00) [7]а давайте предположим:
программа посылает пакет с переодичностью в 60 минут.
ПЕРЕсоединение требует 20 минут(там, коннект, авторизация итд).
Я просто спрашиваю, можно ли узнать когда соединение было потеряно? Как оно потерялось, топором, программно - без разницы.
***
Немного выше я упомянул программу, которая решают мою задачу(без проблем ловит).
Но оказывается далеко ходить не надо - посмотрите на ярлык состояния соединения с локальной сетью. Выньте кабель на пол секунды, вы сразу увидите о потерянном соединении.
КАК?
Сергей М. (2007-03-29 12:12:00) [8]
> вы не знаете как установить момент разрыва?
Знаю.
Единственный правильныйспособ - получить исключение в момент выполнения метода приема/передачи и проанализировать причину исключения для принятия дальнейшего решения
Сергей М. (2007-03-29 12:09:00) [9]
> моментально срабатывает как только я разъеденяю
Кого и как разъединяешь-то ?
Разъединить ведь можно по-разному - можно программно закрыть соединение, а можно и тяпнуть топориком по сетевому кабелю...
umbra (2007-03-29 12:06:00) [10]
> в запасе есь вариант пинга каждые n секунд
зачем это надо? на операции записи в сокет Вы получили исключение - значит, связь оборвалась в промежутке между двумя попытками записи. В этот момент и надо делать дисконнект\коннект и продолжать запись (ну, или начинать заново, смотря что за данные).
Pavel Kuznecov (2007-03-29 12:05:00) [11]т.е. вы не знаете как установить момент разрыва?
я просто видел как это делает другая программа(моментально срабатывает как только я разъеденяю), причем в этот момент я ею не пользуюсь. т.е. данных сам не получаю и не принимаю.
Сергей М. (2007-03-29 12:02:00) [12]
> Я понимаю, что можно "ловить" на не посредственной передачи\приема
> данных
В синхронном режиме никаких иных способов не существует.
> если б я заранее знал, что кабель обрубили, я бы грубо говоря
> сделал коннект\реконнект + приостановил процесс передачи\приема
Ну и в чем проблема ?
try
СинхронныйМетодПередачи
except
Дисконнект
Реконнект
end;
Pavel Kuznecov (2007-03-29 11:54:00) [13]Есть соединение - TCP.
Если обрубить кабель между двумя точками, то этого соединения не будет.
когда обрубили кабель? Я понимаю, что можно "ловить" на не посредственной передачи\приема данных. Но тогда теряется время. т.е. если б я заранее знал, что кабель обрубили, я бы грубо говоря сделал коннект\реконнект + приостановил процесс передачи\приема.
**
в запасе есь вариант пинга каждые n секунд. НО ВСЕ ТАКИ...
Сергей М. (2007-03-29 11:11:00) [14]
> Pavel Kuznecov © (29.03.07 11:07) [8]
Что ты понимаешь под "ловлей момента разрыва" ?
Инди-транспорт - синхронный !
Pavel Kuznecov (2007-03-29 11:07:00) [15]Скажете тоже :)
я читал про это "фишки", мол это сделано для надежности.
***
Конечно, на главный вопрос ответа я не нашел :(
"поймать момент разрыва"
Может есть у кого свежие идеи?
Сергей М. (2007-03-29 10:46:00) [16]Типа нашел ошибку разработчика ?)
Pavel Kuznecov (2007-03-29 10:41:00) [17]Хм...
!!!Разобрался. :)
Спасибо!
***
В юнит: IOHandlerSocket
В функцию: TIdIOHandlerSocket.BindingAllocated
поставил просто try-except
вот и все!
Сергей М. (2007-03-29 10:24:00) [18]
> даже в Log не пишет
А отладчик на что ?
Pavel Kuznecov (2007-03-29 10:07:00) [19]
tcp:TIdTCPCLient
...
function QueryPost(...):integer;
var
...
begin
try
//Отправка пакета
tcp.IOHandler.Write(1);
tcp.IOHandler.Write(1);
except
log('Error inQueryPost'); //В Memo
end;//except
end; //function
Если VPN соединение активно, посылает без проблем, если не активно, то даже в Log не пишет :(
Вот зачем так??? Иди я неправильно EXCEPT ставлю?
А разрыв - просто беру и отключаю соединеие (Разъединить) - своеобразный тест.
Сергей М. (2007-03-29 10:00:00) [20]
> поймать момент разрыва это не поможет
Чтой-то вдруг ?
И какогоразрыва - программного или физического ?