Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.602 c
15-1175172963
ProgRAMmer Dimonych
2007-03-29 16:56
2007.04.22
Стесняюсь спросить (С) Староконь... :)


5-1152112243
Dstr
2006-07-05 19:10
2007.04.22
Лаг Delphi 7


9-1148425149
Strech
2006-05-24 02:59
2007.04.22
Критерии большой пустой области


2-1175256902
Alex_C
2007-03-30 16:15
2007.04.22
Указатель на открытый массив


3-1170165529
s_t_d
2007-01-30 16:58
2007.04.22
QReport - сохранение отчета(путь и имя файла)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский