Re[2]: Живучий объект или склеротические клиенты
От: Павел  
Дата: 06.09.01 06:05
Оценка:
Здравствуйте ZORK, вы писали:


ZORK>Я ставил эксперементы, и вообще не видел что-б он умирал. Единственный способ, который я занаю, после недели ковыряния в этом вопросе — когда клиент подключается к серверу, он отдает серверу интерфейс на себя, чтобы сервер мог дергать какой нить пустой метод этого интерфейса для проверки наличия соединения. Если вызов метода ругается, сервер прекращает соединение. При этом надо быть готовым к ситуации — клиент умер во время вызова этого, или другого метода, тогда вызов надо прерывать по timeout вызовом CoCancelCall.


ZORK>В целом, используя описанное выше и еще CoDisconnectObject, при удалении сессионых объектов, мне удалось построить соединение между несколькими клиентами одновременно использующих один удаленный сервер. При этом соединение корректно разрывается, если одина из сторон умирает скоропостижной (Например: GPF) смертью, или физическое соединение коротковременно, или долговременно разрывается. Хочу обратить внимание, что при коротковрменном разрыве могут возникать проблемы, если одна сторона заметит разрыв, а вторая нет.


ZORK>Если все это интересно, я могу попробовать собрать пример, но на это уйдет пару дней



Все это, конечно, понято, поэтому не очень интересно. Я думал, что есть какая-нибудь хитрость, позволяющая серверу сразу словить момент, когда отваливается клиент, без использования ручной обратной связи. Говорят у ДКОМа есть какой-то встроеный пинг. Может есть возможность настраивать его таймауты?

Сегодня обнаружил, что при корректном завершении клиентского процесса, даже если он не закрыл ссылку, серверная прокся успевает сообщить серверу, что клиент помер. В этом случае рефкаунт на сервере декрементится как положено. Поэтому проблема забывчивых клиентов снимается. Проблема же больных клиентов а так же некачественных соединений до сих пор не решена. Если ее невозможно решить без ручного пинга, то просто непонятно о чем они там, в MS-е, думали, когда проектировали ДКОМ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.