Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Indy 10 и отлов ошибок


Страницы:   1 2

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]


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


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо