Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DCOM и сетевой трафик  (Прочитано 9662 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
осьмилис
Гость
« : 08-03-2004 05:42 » 

ситуация:
имеются два COM-класса, скажем, A и B; они реализуют интерфейсы IA и IB;
(выдержки для dual-версии)

   [
      object,
      uuid(27D75F4E-84A7-411A-A9CE-E681E527CC23),
      dual,
      pointer_default(unique)
   ]
   interface IB : IDispatch
   {
      [id(1)] HRESULT ping();
   };

   [
      object,
      uuid(4DB91673-D91B-40A4-B378-542DAC8A4107),
      dual,
      pointer_default(unique)
   ]
   interface IA : IDispatch
   {
      [id(1)] HRESULT ping();
      [id(2)] HRESULT putB(IB *p);
   };


классы зарегистрированы и созданы их экземпляры на разных машинах;
проверены следующие варианты: IA и IB -- как custom, так и dual;
A и B -- как обыкновенные DCOM-классы, загружаемые в суррогатный процесс,
так и COM+-компоненты серверного приложения; суть дела не меняется. а дело вот в чем:

{
   CComPtr<IA> pa;
   CComPtr<IB> pb;

   pa.CoCreateInstance(CLSID_A);
   QueryInterface(IID_IB,(void**)&pb);
   pa->ping();
   pa->putB(pb);
}

этот фрагмент кода выполняется объектом класса B.

   вопрос: в чем отличие вызова метода IA::ping от вызова метода IA::putB
в смысле обмена по сети?

   логика подсказывает, что в обоих случаях требуется один цикл обмена
(не считая RPC Bind - RPC Bind Ack) -- RPC Request - RPC Response;
так оно и есть, но только в первом случае. во втором, возврату RPC Response
предшествует одна странная штука, а именно, сервер на которм находится объект
класса A соединяется с сервером объекта класса B и вызывает какие-то методы
какого-то интерфейса с GUID {99FCFEC4-5260-101B-BBCB-00AA0021347A}. причем это
происходит до входа в тело метода putB. и все бы оно ничего, работает, но если
сервер B не отвечает, вызов putB так и зависает. в случае COM+ в папке "Компоненты"
в колонке "Время вызова" напротив класса A начинает идти время и ничем этого не изменишь,
кроме остановки сервера A. (ждал, надеясь на какой-ньть разумный таймаут, довольно
долго -- несколько суток Улыбаюсь

   вопрос: что бы это значило? что за интерфейс участвует в обратном вызове?
а главное -- как с этим бороться???
Записан
NetRaider
Гость
« Ответ #1 : 09-03-2004 00:16 » 

Цитата
вопрос: в чем отличие вызова метода IA::ping от вызова метода IA::putB
в смысле обмена по сети?


При вызове IA::putB передается указатель на объект, расположенный на другой машине. Фактически же передается так называемая объектная ссылка(OBJREF), которая содержит OXID, OID, и еще что-то(непомню). Получение этой инф. занимается IOXIDResolver("какой-то интерфейс", раньше назывался IObjectExporter) "Какой-то метод",- это скорее всего ResolveOxid

Цитата

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


Вот это странно, там таймаут максимальный около 2 часов...

Цитата

а главное -- как с этим бороться???


IDL для putB какой-то странный... это же не простой указатель
А если dual, - тогда уж VARIANT.
Записан
осьмилис
Гость
« Ответ #2 : 10-03-2004 03:10 » 

а чего странного в putB?

это не просто указатель... это указатель на интерфейс... все корректно (: пробовал вариации этого с использованием структуры содержащей пачку указателей на разные интерфейсы, запакованную в VARIANT... эффект тот же :7

вопросы: у меня этот "какой-то интерфейс" нигде не зарегистрирован :7 информация по нем есть? и как все-таки с этим бороться -- проблема реальная, сбой в сети и приложение и все клиенты висят ):

...и спасибо, Юра (:
Записан
Таня
Гость
« Ответ #3 : 23-06-2004 05:13 » 

Вопрос:
Для уменшения сетевого трафика DCOM исползует :
-криптографическое зжатие
-групповые вызовы функций
-алгоритмы маршалтинга
Назовите правильный ответ
Записан
NetRaider
Гость
« Ответ #4 : 24-06-2004 01:28 » 

Цитата: Таня
Вопрос:
Для уменшения сетевого трафика DCOM исползует :
-криптографическое зжатие
-групповые вызовы функций
-алгоритмы маршалтинга
Назовите правильный ответ


Что значит 'DCOM исползует' ?  - использует конкретная реализация DCOM(может вообще не использовать). В nt используются групповые вызовы, маршаллинг с сжатием можно самому написать, да и ручное управление никто не отменял.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines