Здравствуйте asv, Вы писали:
asv>Я новичок в COM-программировании, и хотел бы получить вашу консультацию по вопросам, ответы на которые я не смог найти в книжках.
asv>Такая ситуация: exe-сервер, несколько клиентов. Клиенты обращаются к объекту asv>внутри сервера (один экземпляр для всех клиентов), объект генерирует события для клиентов (через механизм connection points). Клиенты и сервер на разных машинах. Все работает, но если мы посмотрим на это дело пессимистически, у нас могут возникнуть такие вопросы:
<вопросы переброшены вниз> asv>Существуют в COM стандартные механизмы обработки таких ситуаций? asv>Если нет, то как такие ситуации вообще можно отследить? Или скажем так: как это обычно делают?
Мне видится, что СОМ как технология изначально не имеет механизмов обработки таких ситуаций. У нас есть HRESULT, и только через него мы и можем поиметь ту или иную информацию. Но проблема-то есть. И скорей всего она решается в области RPC (подсистема вызова удалённых процедур).
Вызов метода несуществующего объекта (изчезнувшего легально или аварийно), скорей всего, вернётся с кодом ошибки RPC_E_XXXX или CO_E_XXX_RPC_XXXX. Во всяком случае, код ошибки не будет связан с работой объекта. Для этого и есть требование СОМ, чтобы любой метод имел сигнатуру HRESULT fff(...), обеспечивающей возврат ошибки от RPC. Однако здесь же лежат ошибки, связанные с таймаутами соединения.
Исчезновение клиента объекта (опять же легально или аварийно), вполне возможно, может обслуживаться stub/proxy соединения с ним: они могут освободить свои ссылки на этот объект.
В любом случае оповещение не предусматривается. Да и механизма такого на поверхности СОМ нет. Т.е. узнавание таких ситуаций лежит как на клиенте, так и на сервере.
asv>1) А что произойдет, если сервер упадет? Глюкануло что-нибудь, подвисло, сетевой шнурок отвалился, кто-то решил тачку перегрузить (кнопкой reset), да мало ли причин может быть. Как клиент узнает, что указатель на интерфейс серверного объекта уже не актуален?
Вызов метода несуществующего объекта (изчезнувшего легально или аварийно), скорей всего, вернётся с кодом ошибки RPC_E_XXXX или CO_E_XXX_RPC_XXXX.
asv>2) Допустим, мы знаем ответ на первый вопрос, и наш клиент умеет определять состояние сервера, и перестает обращаться к серверу, если с ним возникли какие-то проблемы. Но если сервер перезапустили, как клиент узнает, что уже можно опять начинать с ним работать?
Никак. Того объекта, с которым он работал уже нет и никогда не будет. Т.е. нужно пытаться вновь создавать связь точно также, как и при начале работы клиента.
asv>3) А если упадет не сервер, а совсем наоборот, один из клиентов? Как сервер узнает что данного клиента нужно удалить из списка клиентов, которым он посылает сообщения (т.е. для которых он генерирует события)?
С точки зрения событий, сервер уже является клиентом объекта (бывшего) клиента, поэтому смотри п.1.
PS
Упадёт-упадёт... А если "Что будет, если клиент закончит работу (нормальный выход) и не освободит объект сервера?"
Для сервера это тоже ведь плохо. Не так ли.