|
Дата: 2 Фев, 12:08
Привет
Кто посоветует корректный способ закрыть OCB из менеджера ресурсов без запроса клиента? Есть ConnectDetach() и _msg_info::scoid, но я очень сомневаюсь, что при такой операции на канал поступит импульс и библиотека вызовет iofunc_close_ocb(). Во всяком случае в документакции указано, что ConnectDetach() надо делать именно после получения импульса об отсоединении клиента. Следовательно, нелогично, чтоб эта же функция опять генерировала импульс.
Буду благодарен за дельные советы в даном направлении.
|
|
Дата: 23 Апр, 23:37
Отвечаю на собственный вопрос:
Менеджер ресурсов не может по собственному желанию закрыть OCB. В таких случаях надо просто отмечать OCB как невалидный и возвращать ошибку на все последующие операции с ним, кроме close.
|
|
Дата: 8 Сен, 10:52
Вопрос у меня возник подобный и связан вот с чем.
Открывается через QNET на другой машине ресурс. Далее на первой анализирутся код возврата при работе с этим ресурсом для обнаружения нарушения связи по сети. Если она пропадает из-за русурс закрывается и делаются попытки (access) переоткрыть (open) ресурс. Тут возникает проблема с открытием. Точно сказать не могу где конкретно возникает продлема: с access или с open (не мой код). Причем с третьей машини этот ресурс открывается нормально.
Думаю что проблема с незакрытым OCB. Он ведь закрывается по close (соотв. посылкой сообщения).
При отрытии канала ChannelCreate можно установить флаг _NTO_CHF_COID_DISCONNECT - при зарзрыве соединения в канал будет посла импульс с кодом _PULSE_CODE_COIDDEATH. Обработка этого импульса есть в библиотеке dispatch. Как я понял, до библиотеки ресмжр дело не доходит. Что тогда происходит с OCB и свойствами клиента (coid, path и пр.)?
|
|
Дата: 10 Сен, 21:32 · Поправил: oder
Для менеджера ресурсов не надо делать ChannelCreate. Только dispatch_create и resmgr_attach. Посмотрите примеры создания менеджера ресурсов в документации по QNX (Programmer's Guide -> Writing a Resource Manager).
Все импульсы библиотека обрабатывает автоматически. При отключении клиента, вашему серверу придет resmgr_io_funcs_t::close_ocb.
Проблемы с повторным открытием могут возникать если из resmgr_connect_funcs_t:: open вызвать resmgt_open_default(), а потом вернуть ошибку. Так делать никогда нельзя: от этого у библиотеки крыша едет. Всегда надо проверить заблаговременно, все ли условия удовлетворяются и возможно ли открыть ресурс для даного клиента в данном состоянии и лишь потом вызывать resmgr_open_default() для создания OCB. Если у вашего кода есть причины отказать в открытии файла, ошибку надо вернуть вначале и resmgr_open_default() не вызывать. Если вызвали - можно возвращать только EOK.
|