Здравствуйте!
Подскажите, пожалуйста, как поступить в такой ситуации.
Есть ПО: 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);
}
Как мне и с линукса общаться с вин-сервером по данному интерфейсу?
Буду очень благодарен за помощь.