«Уже слушаю» при вызове вызова RPC - PullRequest
1 голос
/ 26 марта 2009

Я использую Microsoft RPC для межпроцессного взаимодействия. У меня есть интерфейс с набором методов, принимающих байтовый канал в качестве параметра "in" (описание IDL):

[
    uuid(ActualGuidHere), 
    version(1.0), 
    pointer_default(unique)
]

interface IMyInterface
{
    //other irrelevant methods here
    error_status_t rpcDoAction( [in] pipe byte params );
    //more irrelevant methods here
}

время от времени, когда я вызываю такие методы на стороне клиента через клиентскую заглушку, сгенерированную MIDL и делегированную NdrClientCall2 (), она не достигает стороны сервера, но NdrClientCall2 () возвращает RPC_S_ALREADY_LISTENING ("Сервер уже слушает "), что действительно сбивает с толку.

Я добавил вход в функции, используемые для операций push / pull во время передачи - их никогда не вызывали ни для одного из вызовов, которые не проходят таким образом. Это означает, что передача даже не началась.

Я никогда не сталкиваюсь с таким поведением при вызове методов, в которых параметры не имеют каналов.

В чем может быть причина и обходной путь?

Ответы [ 2 ]

1 голос
/ 26 марта 2009

Документация кажется довольно минимальной - я не думаю, что существует огромное сообщество пользователей для прямого использования API-интерфейсов RPC - но я предполагаю, что для настройки параметра канала необходимо необходимо для внутреннего вызова RPC RpcServerListen. Только один вызов этого API может блокировать одновременно.

Тот факт, что вы видите проблему только изредка, говорит о том, что она связана со временем, поэтому возможно ли, что вы делаете два таких вызова в разных потоках, и иногда они будут одновременными?

Либо это, либо есть ошибка, связанная с синхронизацией в реализации библиотеки RPC, и вам придется обходить ее, повторяя вызов (это может быть эффективным обходным путем в любом случае).

0 голосов
/ 26 марта 2009

Я думаю, что это не должно рассматриваться как проблема. См. PRB: сбой CoCreateInstance на RPC-сервере

Просмотрите это тоже: Как зарегистрировать несколько интерфейсов сервера RPC

[ОБНОВЛЕНО] Может быть, есть проблема в выпуске памяти. Посмотрите примеры реализации PIPE и проверьте свой код.
Реализация входных каналов на клиенте
Реализация выходных каналов на клиенте
Реализация входных каналов на сервере
Реализация выходных каналов на сервере

Удачи.

...