Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / DCOM отключение клиентов / 21 сообщений из 21, страница 1 из 1
20.12.2005, 20:53
    #33447798
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Существуют ли какие нибудь методики определения на сервере, того
факта что клиент отключился?

Дмитрий


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
21.12.2005, 00:05
    #33447946
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Про дком не скажу, но в корбе (dcom идеологически является калькой с корбы) простого способа нет. Обычно предлагается использовать разные методики определения активности клиента:
1. callback серврером клиента. Но тут понятно
2. Сервис времени жизни объектов. Все зависит от бизнес логики приложения. Самый простой вариант вести учет времени последнего вызова объекта сервера клиентом и по истечению определенного времени освобождать ресурсы.
Где-то я читал, в дкоме реализованы так называемые heart beats сигналы. Т.е раз в определенное клиент и сервер обмениваются определенными пакетами по которым и определяется наличие логического соединения между ними.

все наши на www.corba.kubsu.ru
...
Рейтинг: 0 / 0
21.12.2005, 02:47
    #33447998
AndreiNz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
В COM все это делается через reference count. Т.е. Соединяясь клиент вызывает AddRef() а отсоединяясь вызывает Release(). Клиент не идентифицируется. Просто считаются ативные соединения. Тоже самое должно происходить и в DCOM. Проблемы возникают тогда, когда клиент забывает вызвать Release() или умирает не успев. Но это на одном компьютере. В вашем случае могут еще и провода перерезать.

Существуют и более продвинутые механизмы. Например связка интерфейсов IDataObject - IAdviseSink. Если клиент хочет получать уведомления от сервера, то он должен иметь IAdviseSink, а сервер - IDataObject. Для того, чтобы подписаться на уведомления клиент вызывает IDataObject->DAdvise сервера и получает назад идентификатор соединения. А когда хочет отсоединиться вызывает IDataObject->DUnadvise и передает в нем тот самый идентификатор соединения. Таким образом сервер может вести учет клиентов.
Причем связи могут быть как горячими, когда само уведомление содержит обноаленные данные, теплыми, когда сообщается что данные изменились но не сами данные так и холодными, когда клиент опрашивает сервер. Все это нормально работает в СОМ, будет ли работать в DCOM не знаю, возможно придется писать свой Marshaling.

Проблемы остаются теми же - когда клиент забывает вызвать Release() или умирает не успев + провода...
...
Рейтинг: 0 / 0
21.12.2005, 11:06
    #33448522
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
rodb
Существуют ли какие нибудь методики определения на сервере, того
факта что клиент отключился?

Дмитрий


Posted via ActualForum NNTP Server 1.3
всё таки надо уточнить. Судя по вопросу, тебе надо чтобы сервер знал отвалившийся клиент?
Т.к. например, если на клиенте пошла транзакция, и через 3 клавиши его вырубить, то сервер автоматически начинает откат.
Если тебе потерянные коннекты надо на сервере, то это язык сервера и форум тоже.
...
Рейтинг: 0 / 0
21.12.2005, 11:08
    #33448532
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Petro123 rodb
Существуют ли какие нибудь методики определения на сервере, того
факта что клиент отключился?

Дмитрий


Posted via ActualForum NNTP Server 1.3
всё таки надо уточнить. Судя по вопросу, тебе надо чтобы сервер знал отвалившийся клиент?
Т.к. например, если на клиенте пошла транзакция, и через 3 клавиши его вырубить, то сервер автоматически начинает откат.
Если тебе потерянные коннекты надо на сервере, то это язык сервера и форум тоже.
бес попутал :) - у тебя сервер DCOM имеется ввиду. Тогда ответили :)
...
Рейтинг: 0 / 0
21.12.2005, 11:54
    #33448760
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Спасибо всем отвечающим.
Ответы как раз в тему.

Да. Имеется ввиду удаленный DCOM сервер
и обрыв проводов.

Интересен тот факт, что приблуда TypeLibrary в
среде билдер, которая создает реализацию Impl сервера,
не создает деструктор.

Я попробовал вручную его туда поставить, и он действительно вызывается
если удаленный клиент корректно завершает работу.

Вот с обрывом проводов, тут присутствующие верно подметили.
Если провода оборвать, то объект сервера сидит в памяти компьютера ничего не
подозревая об отвалившемся клиенте.

Дмитрий


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
21.12.2005, 12:29
    #33448916
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Научите как
серверному объекту DCOM убить самому себя правильно в стиле COM.

Дмитрий.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
21.12.2005, 13:51
    #33449259
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Всем,

А можно ли теоритически, в серверном COM объекте
вычислить IP или MAC адрес клиента с целью запретить
создевать более одного серверного потока на клиентскую машину?

Дмитрий


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
21.12.2005, 21:49
    #33450619
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
да, если апосля коннекта передать серверу эту инфу с клиента :)
...
Рейтинг: 0 / 0
21.12.2005, 22:12
    #33450640
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
JibSkeart,
>да, если апосля коннекта передать серверу эту инфу с клиента :)

согласен.
наверное это единственный способ.

Может кто еще какие идеи подаст?

Дмитрий.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
22.12.2005, 11:10
    #33451206
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
покопай по ответу AndreiNz .
Всё остальное Iadvise и т.д. предпологает - подписка и отписка от оповещения. Что в случаях потери кабеля не работает.
Посмотрикак OS определяет что приложение зависло? Ведь оно не отвечает.
В пармеире реестра есть число миллисекунд, через которое неответивший клиент считается мёртвым.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
22.12.2005, 22:44
    #33453240
AndreiNz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Вообще, в коммуникационных системах существует стандартное решение подобной проблемы: Hartbeat. Т.е вы посылаете предельно простое сообщение и ожидаете ответ, если ответа нет, то соединение потерянно. В СОМ можно, например, унаследоваться от IAdviseSink, добавив к нему метод HartBeat , который должен возвращать S_OK. И вызывать его периодически. Посмотреть, что он вернет, если разорвать провода.
...
Рейтинг: 0 / 0
23.12.2005, 10:27
    #33453688
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
AndreiNz,
И всем

>Т.е вы посылаете предельно простое сообщение и ожидаете ответ, если ответа
нет, то соединение >потерянно. В СОМ можно, например, унаследоваться от
IAdviseSink, добавив к нему метод HartBeat ,

Спасибо большое за проявленное внимание.

Дмитрий


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
23.12.2005, 11:31
    #33453914
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
AndreiNzВообще, в коммуникационных системах существует стандартное решение подобной проблемы: Hartbeat. Т.е вы посылаете предельно простое сообщение и ожидаете ответ, если ответа нет, то соединение потерянно. В СОМ можно, например, унаследоваться от IAdviseSink, добавив к нему метод HartBeat , который должен возвращать S_OK. И вызывать его периодически. Посмотреть, что он вернет, если разорвать провода.
думаю можно ещё проще:
Код: plaintext
1.
IЖивЛиТы.AddRef // если мёртвый то будет исключалка
IЖивЛиТы.Release
...
Рейтинг: 0 / 0
23.12.2005, 22:20
    #33455462
AndreiNz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Petro123 AndreiNzВообще, в коммуникационных системах существует стандартное решение подобной проблемы: Hartbeat. Т.е вы посылаете предельно простое сообщение и ожидаете ответ, если ответа нет, то соединение потерянно. В СОМ можно, например, унаследоваться от IAdviseSink, добавив к нему метод HartBeat , который должен возвращать S_OK. И вызывать его периодически. Посмотреть, что он вернет, если разорвать провода.
думаю можно ещё проще:
Код: plaintext
1.
IЖивЛиТы.AddRef // если мёртвый то будет исключалка
IЖивЛиТы.Release


Пожалуй, Да.

Только в данном случае вы вызываете 2 метода вместо одного. А, принимая во внимание то, что общение еидет через сеть, один метод может оказаться эффективнее.
...
Рейтинг: 0 / 0
26.12.2005, 11:01
    #33456911
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Если вызвать один, то клиент не умрёт никогда, т.к. вы нарушили его счётчик, по которому он обязан умереть.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
26.12.2005, 13:53
    #33457445
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Да.

нестоит забывать что heart beats
не работают в WAN.

Поэтому я буду использовать допотопную методику поддержания
жизни серверных объектов - импульсами с самих клиентов и умирания по
тайм-ауту.

Не подскажет ли уважаемый ALL
какие таймеры (и как) нужно использовать в серверных объектах DCOM
для самоуничтожения.
Я поставил TTimer - ан нет. Не хотит он нормально работать в многопоточной
среде.
Валится.

Дмитрий.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
26.12.2005, 22:09
    #33458404
AndreiNz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
Вообще-то я говорил про HeartBeat как отдельный метод, а вовсе не про вызов одного из Release или AddRef в отдельности.

И почему это но не работает в WAN? Если реализация HeartBeat сделана через UDP, то у вас будут проблемы, Если же используется TCP/IP, то проблем быть не должно. Вы же говорите о DCOM, который сидит на TCP/IP.

Для таймера, в крайнем случае можно запускать отдельную Thread, которая ничего не делает, а только спит определенное время, а когда просыпается, то делает то, что вам нужно и умирает. Если же клиент откликается до того как истекет интервал, то вы убиваете Thread.
...
Рейтинг: 0 / 0
27.12.2005, 12:48
    #33459272
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
AndreiNz,

Разрешите поблагодарить вас за поддержку данной дискусии и
поздравить с Новым Годом!

>Для таймера, в крайнем случае можно запускать отдельную Thread, которая
ничего не делает, а только >спит определенное время, а когда просыпается, то
делает то, что вам нужно и умирает. Если же клиент >откликается до того как
истекет интервал, то вы убиваете Thread.

Одна из проблем на которую я наступил в BCB это то, что
серверный COM объект не убивается, при убитии его извне(не клиентом)
Например:
Имею указатель на обертку объекта СОМ на серверной стороне.
TTCOMServerImpl *a_Thread .....
while(a_Thread->GetUnknown()->Release())
{ int a; a++;};

Высвобождаю ссылки на объект. Согластно общепринятым правилам
СОМ - этот объект должен умереть.
Но он в действительности убивается не сразу. Я поставил Beep() - ы
в тело объекта и Оказывается он еще определенное время продолжает
выполнять запросы клиента. Я заметил что это длиться до тех пор пока я не
активирую мышью
GUI сервера. Как буд-то среда СОМ начинает убивать ком объект только после
WM_ сообщений контейнера в котором находится СОМ объект.

Спасибо.

Дмитрий.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
28.12.2005, 22:59
    #33463169
AndreiNz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
rodb,

Я сам DCOM-ом не пользуюсь. Предпочитаю использовать TCP/IP для межкомпьютерного взаимодействия. А локально использую СОМ.

Из того, как я понимаю ситуацию, сервер (не только DCOM, но и любой сервер) желательно держать в памяти в постоянной готовности к запросам. То есть то что сервер не убивается, может оказаться положительным фактором.

Спасибо, за поздравления.

Вас так же поздравляю с наступающим Новым Годом.

Андрей.
...
Рейтинг: 0 / 0
29.12.2005, 11:29
    #33463797
rodb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCOM отключение клиентов
AndreiNz,

>Из того, как я понимаю ситуацию, сервер (не только DCOM, но и любой сервер)
желательно держать в >памяти в постоянной готовности к запросам. То есть то
что сервер не убивается, может оказаться >положительным фактором.

Для локоальных приложений скорее всего это обязательное правило, стабильной
работы.
А вот для распределенных я уже думаю что проблема.

Причины - сетевые проблемы.
Например сеть упала а объект остался в памяти на серверной машине
и серверное приложение думает что он живой.

Потом есь причины - секьюрити, Когда на серверное приложение просто обязано
убивать клиентов по своим соображениям.

Дмитрий


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / DCOM отключение клиентов / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]