![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить момент отключения сетевого кабеля. WM_????? [D7, Win2k]
Bobby © (2005-09-12 12:10:00)Или что-нибудь другое?
WondeRu (2005-09-13 13:57:00) [1]год назад задавал этот же вопрос, вот был ответ
Verg © (07.09.04 10:50) [2]
Если говорить о сети TCP/IP, то отключение сетевого адаптера немедленно приводит к изменению в маршрутной таблице, разрыву всех установленных через этот интерфейс TCP соединений.
Изменение в маршрутной таблице можно отслеживать ф-цией
function NotifyRouteChange( Handle : PHandle; Overlapped : POverlapped):DWORD; stdcall; external 'IPHLPAPI.DLL';
После наступления изменения просмотреть все адаптеры ф-цией
function GetIfTable(pIfTable : PMIB_IFTABLE; var pdwSize : ULONG; bOrder : BOOL): DWORD; stdcall;external 'IPHLPAPI.DLL';
Отключенный адаптер будет иметь состояние
dwOperStatus <> MIB_IF_OPER_STATUS_OPERATIONAL (5)
или
dwAdminStatus <> MIB_IF_ADMIN_STATUS_UP (1)
Только это все полумеры, т.к. связь с сервером БД так же может оборваться из-за множества других причин, а результат один - СУБД не работает.
Nick Denry (2005-09-13 13:05:00) [2]Джо © (13.09.05 01:27) [13]
Я не пытаюсь :)
А как решить проблему пользователя, нажимающего на ресет?
Про пальцы я уже говорил :)
Eraser (2005-09-13 01:55:00) [3]bobby (12.09.05 21:03) [7]
иногда пользуюсь компонентами. ADO, Indy и пр
В Indy довольно развит механизм искл. ситуаций.
Джо (2005-09-13 01:27:00) [4][11] Nick Denry © (12.09.05 23:53)
> просто на программном уровне решить ее практически невозможно
После таких слов чертовски хочется увидеть пример того, как вы пытаетесь решить. Может, как-то не так пытаетесь?
simpson (2005-09-13 00:31:00) [5]> Bobby (12.09.05 18:07) [2]
> База данных. Открыты запросы. Открыты окна.
> Юзер отключает сеть в трее. Пилец.
Ну... не знаю. И что? Ну, подошел я сейчас к кассовому терминалу. Отрубил его. Жестко. Ресетом, эксперимента ради. В момент печати чека, в добавок. И соединение с базой было, и окна были открыты.
Ну и нифига тяжелого - ни тебе "левых" данных в базе, ни тебе чека лишнего. Все корректно отработало. Могу поклясться, что никакого мониторинга - подключен или отключен сетевой кабель - у меня нет.
> Проблема в том, что последствия тяжелые
Перечислить можно? Особенно интересны те, которые убивают базу данных. А как же откат транзакций и т.п.? С какой СУБД ведется работа?
Кстати, а зачем постоянно держать открытыми конфигурационныефайлы? Это что за необходимость такая? Загрузки настроек в начале работы приложения недостаточно (ну, если очень хочется, то перезагрузки по определнному сигналу)?
> иногда пользуюсь компонентами. ADO, Indy и пр.
> Это не я обрабатываю, а они
Очень плохо, что не ты. Они исключения как раз в большинстве своем не обрабатывают, к счастью. Я думаю, масса людей расстроилась, если бы компоненты сами обрабатывали исключения, и, соответсвенно, сами определяли реакцию твоегоприложения.
По сабжу. Как вариант, по таймеру читать состояние сетевых интерфейсов (см. MSDN, IP Helper).
Но, IMHO, очередная проктологическая операция на гладнах.
См. Digitman © (12.09.05 16:15) [1].
Nick Denry (2005-09-12 23:53:00) [6]> Проблема выдумана. Проблемы не существует.
Извините, может я не совсем прав, но:
Проблема существует. Это проблема (как минимум пользователей), просто на программном уровне решить ее практически невозможно, хоть порой и очень хочется.
Я помню еще был вариант с отрубанием пальцев юзерам, но это не полностью программное решение. :)
а вообще-то подсказка где-то в Ihor Osov'yak © (12.09.05 18:36) [6], а так же в NTFS и вообще в журналирумых базах данных.
Ihor Osov'yak (2005-09-12 22:29:00) [7]> Проблема выдумана. Проблемы не существует.
Подтверждаю.
Джо (2005-09-12 21:19:00) [8]
> [7] bobby (12.09.05 21:03)
> Тема неперехватываемых исключений в Delphi не выдумана.
> Проблема существует
Проблема выдумана. Проблемы не существует.
Джо (2005-09-12 21:17:00) [9]
> Не проще ли поймать уведомление о готовящемся отключении
> девайса или пропавшем сетевом кабеле?
Или о начавшемся потоме в серверной. Или землетрясении в Австрали...
bobby (2005-09-12 21:03:00) [10]Я, увы , грешен и иногда пользуюсь компонентами. ADO, Indy и пр. Это не я обрабатываю, а они. У всего есть свои преимущества и недостатки, если в делфях игнорировать компоненты, так это лучше на C писать - вот где раздолье для ламера. Тема неперехватываемых исключений в Delphi не выдумана. Проблема существует. Создайте новый проект, в нем создайте поток, в нем создайте, к примеру Indy ICMP-клиента - пусть что-нибудь попингует в цикле. А в это время поиграйте с настойками IE, например с Proxy или вырубите сеть на апплете. Это самое простое, с чем столкнулся я. А потом расскажете, как вы обрабатываете исключения в ntdll.dll. Не проще ли поймать уведомление о готовящемся отключении девайса или пропавшем сетевом кабеле? Разберусь если - расскажу...
Ihor Osov'yak (2005-09-12 18:36:00) [11]если имеется в виду сетевой в смысле net, а не power, то очень похоже на то, что Вы просто некорректно обрабатываете исключения в коде, поддерживающем сетевые соединения и/или ответственном за взаимодействие с сервером базы данных. Вполне возможно, что сюда относятся и операции ввода/вывода, если он осуществляется на сетевые ресурсы.
Либо вообще не обрабатываете.
Имхо, нужно немного изменить идеологию обработки исключительных ситуаций и ошибок ввода-вывода. А не ловить черную кошку в черной комнате.
Bobby (2005-09-12 18:20:00) [12]Стоит. Не часто, но,случается всякое. Ручки шаловливые, уборщицы со швабрами. Проблема в том, что последствия тяжелые. Система, начинает вытворять черте чего. Не все исключения поддаются обработке. Программа ненормально завершается. Бьются настройки и конфигурационные файлы. Я думаю, что предвидеть такие ситуации - хороший стиль. Но мозгов не хватает. Сейчас читаю про WM_DEVICECHANGE, но это относится к отключению устройства. Надо разбираться с физическим выключением кабеля.
Игорь Шевченко (2005-09-12 18:11:00) [13]Bobby (12.09.05 18:07) [2]
> База данных. Открыты запросы. Открыты окна. Юзер отключает
> сеть в трее
Кнопку Reset ты же все равно не перехватишь. Так стоит ли утруждать себя борьбой с пользователями, вынимающими сетевой кабель ?
Bobby (2005-09-12 18:09:00) [14]Кстати начинаю понимать, что выдергивание сетевого разъема и отключении сети через аплет в трее система воспринимает неодинаково. Сижу, копаю...
Bobby (2005-09-12 18:07:00) [15]База данных. Открыты запросы. Открыты окна. Юзер отключает сеть в трее. Пилец.
Digitman (2005-09-12 16:15:00) [16]смысл ?