[RPC] перенос клиента на linux
От: Alexander8  
Дата: 12.07.10 05:40
Оценка:
Здравствуйте!

Подскажите, пожалуйста, как поступить в такой ситуации.

Есть ПО: windows-сервер и windows-клиенты, общающиеся по RPC-протоколу.
RPC-часть сгенерированна при помощи MIDL-компилятора.
Появилась необходимость портировать клиента на linux (хотя бы часть функционала),
сервер останется на windows. Более того, значительные изменения сервера нежелательны,
тем более перевод его на какую-нибудь кроссплатформенную реализацию rpc-технологию.

Вопрос в том, как с линукс-платформы клиентом вызвать нужную rpc-функцию с windows-сервера?
В принципе, везде написано, что такие вещи возможны, но как это сделать нигде не уточняется.

Я смотрел в сторону rpcgen-а, но он только для линукса.

В сторону FreeDCE, сначала думал, что нашел то, что надо, но, к сожалению проект мертв, документации мало.
Удалось dceidl-ом скомпилировать интерфейс, даже "прибиндиться" к серверу, но вот при вызове rpc-функций клиент падает.
Да и dceidl не поддерживает некоторые вещи (хотя и не это главное).

Также посмотрел и widl (эмуляция rpc от wine). Wine клиента, кстати, без проблем гоняет. Но нужен родной линуксовый.

В общем, нужна технолгия, которая позволит подружить rpc-часть linux-клиента и уже существующего win-сервера.

Чтобы конкретизировать вопрос, пусть есть вымышленный интерфейс, по которому общаются виндовый сервер и клиенты:

import "oaidl.idl";
import "ocidl.idl";
[
   uuid(51D82444-6400-4a55-A20E-72123QQF08D),
   version(1.0)
]
interface CONNECTION
{
   typedef [context_handle] void* CONTEXT_HANDLE;
   const int BUFSIZE = 128;
   // Открыть соединение с сервером.
   CONTEXT_HANDLE Open(
        [in] handle_t hBinding,
        // Имя клиента
        [in, string] const char clientName[BUFSIZE],
        // Здесь можно получать что-то в ответ от сервера.
        [out, string] char data[BUFSIZE]);
   // Получить что-то от сервера.
   void GetData(
        // Имя файла, который нужно получить.
        [in, string] const char fileName[BUFSIZE],
        [in] CONTEXT_HANDLE hContext,
        // Размер получаемых данных.
        [out] int *size,
        [out, size_is(,*size)] char **data,
        // Код возможной ошибки.
        [out] int *error);
   // Закрыть соединение с сервером.
   void Close(
        [in, out] CONTEXT_HANDLE* phContext);
}


Как мне и с линукса общаться с вин-сервером по данному интерфейсу?

Буду очень благодарен за помощь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.