Здравствуйте Grenal, вы писали:
G>Здравствуйте Аноним, вы писали:
А>>Здравствуйте Grenal, вы писали:
G>>>Такая проблема — сервер падает, перегрузили его. Как клиенту словить этот факт и корректно почистить дохлые ссылки на серверные интерфейсы, а так же стоки. Аналогично для сервера, как освободить контекст пользователя, если он внезапно отвалился. Буду благодарен дюбым размышлениям на эту тему, а то я уже вторую неделю думаю, ничего не придумывается :(
А>>Что такое "контекст пользователя"? А>>DCOM сам отвалит гнилые прокистабы (у DCOM'а есть пинг) А>>Клиент "словит" факт падения сервера при попытки вызвать метод гнилового прокси. А>>Если нужно знать это в рантайме — напиши свой метод Ping у какого-нибудь объекта и дергай его каждые n секунд (QueryInterface или AddRef в этой роли не годятся, т.к. DCOM кэширует эти вызовы)
G>Про контекст пользователя. На сервере есть ресурсы, которые пользователь может удаленно захватывать. Ресурсы предоставляет компонент в EXE, который создан как DECLARE_CLASSFACTORY_SINGLETON. Когда пользователь отваливается, он не успевает освободить ресурс и ресурс становится недоступен другим пользователям. Мне приходит в голову только способ при помощи Ping'ов, если типа ping от пользователя не пришел, то его ресурсы можно освобождать. Или может у DCOM есть что-то типа CAsyncSocket::OnClose().
G>Клиент словит падения прокси при вызове методов последнего, это я понимаю, а вот как мне вычистить ссылки на серверные интерфейсы или их можно просто обнулить и как поступить со сток интерфейсами. И клиент и сервер у меня С++ интерфейсы на базе IUnknown.
Про контекст пользователя: Что значит захватывать? Если на все время клиентской сессии, то лучше деражть все ресурсы в несинглтоновском серверном объекте. Тогда это объект умрет, кода умрет его единственная (если не давать его кому-то еще) прокся. Как при корректном ее релизе клиентом, так и, в идеале, при обрыве соединения или некорректной смерти клиента.
Создать такой объект можно и вызовом какого-нибудь метода вашего синглтона
Ненадо ничего специально вычищать — освободи все ссылки, как при нормальном выходе и забутьте о них — заново CoCreateInstance, подписки и т.д.