none
зависание клиентского приложения при аварийном завершении работы сервера DCOM RRS feed

  • Вопрос

  • Есть клиентское приложение, которое вызывает методы сервера  по DCOM. В какой-то момент приложение-сервер аварийно завершается (например вручную убивается из процессов). В итоге поток клиентского приложения, вызвавший в этот момент метод сервера, остается висеть (по крайней мере не продолжает работу со стороны клиента). Причем это происходит не всегда. в большинстве случаев он возвращается и продолжает свою работу.
    Вопрос: что может спровоцировать зависание клиентского потока?

Все ответы

  • Клиент работает с удалённым сервером посредством операций сетевого обмена. Скорее всего, на операции получения ответа от сервера (грубо говоря, Receive) клиент, а точнее библиотека DCOM и подвисает.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

  • если это так, то  в чем может быть причина подвисания? как можно убедиться, что это так? и как избежать этого подвисания? (система работает на windows server 2003 SP2 x86)
  • Причину я Вам уже сообщил - блокирующая операция чтения из сокета. Убедиться, так это или нет можно в отладчике. Загрузите символы системных библиотек с сервера MS, запустите клиент в режиме отладки и приостановите отладку в момент зависания клиента. Стек вызовов покажет Вам, чего ожидает программа.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

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

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

    Либо сообщение от сервера блокируется например антивирусным ПО? 

  • Думаю, более вероятен первый вариант. Если бы антивирус или брандмауэр блокировали сетевую активность, Вы бы совсем не могли взаимодействовать с сервером (даже, когда он работает).

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


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!