Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Indy 10 и отлов ошибок   Найти похожие ветки 

 
Pavel Kuznecov ©   (2007-03-29 09:17) [0]

Всем привет!
Подскажите как отловить сообщения об ошибках в Indy(10) ?
Ситуация такая:
Передаю некоторую информацию по TIdTCPClient(IOHandler.Write) с переодичностью 10сек.
Данные идут через Интернет(vpn). НО если разорвать соединение VPN, то всплывает ошибка "10054
Connection reset by peer"

***
В TcpClient я бы словил OnError и все., Но в Инди такого нету :(
Поможете?
Буду благодарен за любую помощь!

(BDS2006,Indy10,WinSer 2003)


 
Сергей М. ©   (2007-03-29 09:50) [1]

try .. except


 
Pavel Kuznecov ©   (2007-03-29 09:54) [2]

>>Сергей М. ©   (29.03.07 09:50) [1]
Спасибо.
Но поймать момент разрыва это не поможет.
>>ALL
Может знаете как все таки получить событие?


 
Сергей М. ©   (2007-03-29 10:00) [3]


> поймать момент разрыва это не поможет


Чтой-то вдруг ?
И какого разрыва - программного или физического ?


 
Pavel Kuznecov ©   (2007-03-29 10:07) [4]


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:24) [5]


> даже в Log не пишет


А отладчик на что ?


 
Pavel Kuznecov ©   (2007-03-29 10:41) [6]

Хм...
!!!Разобрался. :)
Спасибо!
***
В юнит: IOHandlerSocket
В функцию: TIdIOHandlerSocket.BindingAllocated
поставил просто try-except
вот и все!


 
Сергей М. ©   (2007-03-29 10:46) [7]

Типа нашел ошибку разработчика ?)


 
Pavel Kuznecov ©   (2007-03-29 11:07) [8]

Скажете тоже :)
я читал про это "фишки", мол это сделано для надежности.

***
Конечно, на главный вопрос ответа я не нашел :(
"поймать момент разрыва"
Может есть у кого свежие идеи?


 
Сергей М. ©   (2007-03-29 11:11) [9]


> Pavel Kuznecov ©   (29.03.07 11:07) [8]


Что ты понимаешь под "ловлей момента разрыва" ?
Инди-транспорт  - синхронный !


 
Pavel Kuznecov ©   (2007-03-29 11:54) [10]

Есть соединение - TCP.
Если обрубить кабель между двумя точками, то этого соединения не будет.
когда обрубили кабель? Я понимаю, что можно "ловить" на не посредственной передачи\приема данных. Но тогда теряется время. т.е. если б я заранее знал, что кабель обрубили, я бы грубо говоря сделал коннект\реконнект + приостановил процесс передачи\приема.
**
в запасе есь вариант пинга каждые n секунд. НО ВСЕ ТАКИ...


 
Сергей М. ©   (2007-03-29 12:02) [11]


> Я понимаю, что можно "ловить" на не посредственной передачи\приема
> данных


В синхронном режиме никаких иных способов не существует.


> если б я заранее знал, что кабель обрубили, я бы грубо говоря
> сделал коннект\реконнект + приостановил процесс передачи\приема


Ну и в чем проблема ?

try
СинхронныйМетодПередачи
except
 Дисконнект
 Реконнект
end;


 
Pavel Kuznecov ©   (2007-03-29 12:05) [12]

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


 
umbra ©   (2007-03-29 12:06) [13]


> в запасе есь вариант пинга каждые n секунд

зачем это надо? на операции записи в сокет Вы получили исключение - значит, связь оборвалась в промежутке между двумя попытками записи. В этот момент и надо делать дисконнект\коннект и продолжать запись (ну, или начинать заново, смотря что за данные).


 
Сергей М. ©   (2007-03-29 12:09) [14]


> моментально срабатывает как только я разъеденяю


Кого и как разъединяешь-то ?

Разъединить ведь можно по-разному - можно программно закрыть соединение, а можно и тяпнуть топориком по сетевому кабелю...


 
Сергей М. ©   (2007-03-29 12:12) [15]


> вы не знаете как установить момент разрыва?


Знаю.
Единственный правильный способ - получить исключение в момент выполнения метода приема/передачи и проанализировать причину исключения для принятия дальнейшего решения


 
Pavel Kuznecov ©   (2007-03-29 12:22) [16]

а давайте предположим:
программа посылает пакет с переодичностью в 60 минут.
ПЕРЕсоединение требует 20 минут(там, коннект, авторизация итд).
Я просто спрашиваю, можно ли узнать когда соединение было потеряно? Как оно потерялось, топором, программно - без разницы.
***
Немного выше я упомянул программу, которая решают мою задачу(без проблем ловит).
Но оказывается далеко ходить не надо - посмотрите на ярлык состояния соединения с локальной сетью. Выньте кабель на пол секунды, вы сразу увидите о потерянном соединении.
КАК?


 
Сергей М. ©   (2007-03-29 12:57) [17]


> Выньте кабель на пол секунды, вы сразу увидите о потерянном
> соединении.
> КАК?


Ну все в одну кучу - и мухи, и котлеты)

Инди-то тут причем ?

И на какой стороне ты "вынимаешь кабель" - на своей или на стороне партнера ? Это в ряде случаев очень важно !


 
Pavel Kuznecov ©   (2007-03-29 13:22) [18]

на счет мух: ну это ж пример. просто пример.
На счет Инди: Ну делаю я чрез Инди. Нужно словить обрыв.
На счет с какой стороны: да без разницы. представьте, что соединение прямое PC-PC.


 
Сергей М. ©   (2007-03-29 13:32) [19]


> На счет с какой стороны: да без разницы


Тебе так только кажется. Разница есть и весьма ощутимая.


> соединение прямое PC-PC


Это только частный случай.


> Ну делаю я чрез Инди. Нужно словить обрыв


Сказка про белого бычка)

Обрыв, еще раз повторяю, вполне может произойти на стороне партнера, и никаких извещений об этом обрыве ты не получишь - спасет только ловля исключения при выполнении приема/передачи. И это и есть универсальный способ определения разрыва соединения по любым причинам.


 
Anatoly Podgoretsky ©   (2007-03-29 23:04) [20]

> Pavel Kuznecov  (29.03.2007 11:54:10)  [10]

Момент разрыва не является ошибкой.
Ошибкой является не получения отклика от сервера


 
Anatoly Podgoretsky ©   (2007-03-29 23:06) [21]

> Pavel Kuznecov  (29.03.2007 12:22:16)  [16]

А теперь вытащи кабель после энного маршрутизатора.
То что ты пишешь является функцией сетевой платы и срабатывает только на кабель присоединеный к ней


 
Anatoly Podgoretsky ©   (2007-03-29 23:07) [22]

> Pavel Kuznecov  (29.03.2007 13:22:18)  [18]

Как это без разницы?
Шутишь?



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.035 c
9-1148506360
lstalkerl
2006-05-25 01:32
2007.04.22
Нужна помощь по формам


15-1174749101
Kolan
2007-03-24 18:11
2007.04.22
Опрос: Какой синтаксис поисковах запросов вы бы использовали?


15-1175077376
atruhin
2007-03-28 14:22
2007.04.22
Как перенести данные Outlook 2003


15-1174902497
ProgRAMmer Dimonych
2007-03-26 13:48
2007.04.22
Помогите, плз, найти MIDI-файл


15-1174896516
Нулевой
2007-03-26 12:08
2007.04.22
Кто такой?