DCOM: как закрыть соединение на сервере при сбое клиента?

У меня довольно старый проект: клиент и сервер DCOM, оба на C ++ \ ATL, только платформа Windows. Все работает нормально: локальные и удаленные клиенты подключаются к серверу и работают одновременно без проблем.

Но когда удаленный клиент аварийно завершает работу или убивается из-за диспетчера задач, команды taskkill или выключения питания - у меня возникает проблема. Мой сервер ничего не знает о сбое клиента и пытается отправить новые события всем клиентам (в том числе уже разбитым). В результате у меня есть пауза (сервер не может отправлять данные уже разбившемуся клиенту), и ее продолжительность пропорциональна количеству разбившихся удаленных клиентов. После 5 сбоев клиентов паузы настолько велики, что они равны полной остановке сервера.

Я знаю о механизме «пинга» DCOM (DCOM должен отключать клиентов, которые не отвечают на «пинг каждые 2 минуты» после 6 минут молчания) . И действительно, после 6 минут зависания у меня небольшой период нормальной работы, но потом сервер возвращается в состояние "пауза".

Что мне со всем этим делать? Как заставить DCOM "пинговать" нормально работать? Если буду реализовывать свой "пинг" code можно ли вручную отключить соединение старых DCOM клиентов? Как это сделать?

6
задан Ezh 25 January 2011 в 14:39
поделиться