Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализации RPC на С++, (remote procedure call) 
:(
    Опции темы
GoldFinch
Дата 8.8.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



какие есть реализации RPC (remote procedure call) на С++ 
удобные в плане расширения-переделки, написания пользовательского кода?

какие вообще есть подходы к реализации RPC на С++ ?
PM MAIL ICQ   Вверх
GoldFinch
Дата 8.8.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



интересны только библиотеки с открытым исходным кодом, чтобы можно было допилить под конкретную задачу, а не COM и т.п.
PM MAIL ICQ   Вверх
Cheloveck
Дата 8.8.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32





--------------------
user posted image
PM Jabber   Вверх
Любитель
Дата 9.8.2009, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Для обычного SOAP можно найти библиотечки.


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 9.8.2009, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



PM   Вверх
GoldFinch
Дата 9.8.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



омг почему они все такие неудобные?
мне надо взять готовую систему, и поделить на 2 части, связав их RPC, при этом процесс разделения должен вносить минимальные изменения в код системы, 
например было
Код

//foo.h
void foo(int a, int b)
{
... // реализация
}

//user_code.cpp
foo(1,2);

а стало
Код

//foo.h
void foo(int a, int b)
{
    Archive archive;
    archive<<FOO_ID<<a<<b;
    send(archive);
}

//user_code.cpp
foo(1,2);

но писать на каждую функцию\метод по заглушке я не хочу, а хочу чтобы они както генерились библиотекой RPC

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

например возможен такой код
Код

//rpc.h
#define RPC_DECL(id,name) \
    {    rpc::remote::call(id,_AddressOfReturnAddress(),&name); }

namespace rpc {
    namespace remote {
                template<typename T1, typename T2>
        void call( rpc_id_t id, void* frame, void(*)(T1,T2) )
        {
#pragma pack(push,4)
            struct StackFrame
            {
                char* retaddr;
                T1 a1;
                T2 a2;
            } *f = (StackFrame*)frame;
#pragma pack(pop)
            network::packetbuf buf;
            serialization::raw_oarchive<network::packetbuf> ar(buf);
            ar<< id << f->a1 << f->a2;
            conn_.send(buf);
        }

//foo.h
void foo(int a, int b)
     RPC_DECL( FOO_ID, foo )

//user_code.cpp
foo(1,2);


а всякие реализации CORBA, XML-RPC со своими транспортами и необходимостью писать МНОГО кода - мне не нужны
даже в статье http://www.rsdn.ru/article/files/libs/RPCLib.xml более удобное решение, правда с дефайнами
PM MAIL ICQ   Вверх
Любитель
Дата 9.8.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Если ты хочешь использовать собственный протокол - то зачем нужна библиотека?! Сделать обёртку для вызова метода - вообщем-то можно. Автоматически подставить везде вызов обёртки невозможно само собой. Должен быть способ опознавания ремоут-метода от не-ремоут. Удобный вариант - если у тебя все ремоут-методы через интерфейсы вызываются и создаются через фабрику. Тогда можно написать генератор реализаций обёрток (и самой фабрики) и использовать полученный код.


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 9.8.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  9.8.2009,  10:47 Найти цитируемый пост)
но писать на каждую функцию\метод по заглушке я не хочу, а хочу чтобы они както генерились библиотекой RPC

а вот такого типа заглушка устроит ?
Код

void f (int a, int b) { rpc_call ( 8, a, b ); }


ее можно например так замакросить :
Код

#define DEF_RPC_CALL_2(name, id, P1,P2) void name(P1 p1, P2 p2) { rpc_call (id,p1,p2); }

тогда :
Код

DEF_RPC_CALL_2 (f, 8, int, int)

f( 3, 5 );


Это сообщение отредактировал(а) mes - 9.8.2009, 13:46


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.8.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



mes, допустим заглушка выглядит так.

разница между 
  DEF_RPC_CALL_2 (f, 8, int, int)
и 
  void f(int a, int b) DEF_RPC_CALL(8, f)
не слишком велика

-----------------------

Пока у меня получается что у клиента есть допустим такой код
Код

//Bar.h

class Bar
{
public:    
    typedef int rpc_id_t;
    typedef Bar this_t;

public:
    void ready()        { rpc::remote::call( 200 ,this,_AddressOfReturnAddress(),&this_t::ready ); } 
    void result(int r)    { rpc::remote::call( 201 ,this,_AddressOfReturnAddress(),&this_t::result ); }

public:
    Bar(network::connection& conn) : conn_(conn) {}

public:
    network::connection& conn_;
};

а у сервера такой
Код

//Bar.h

class Bar
{
public:    
    typedef int rpc_id_t;
    typedef Bar this_t;

public:
    void ready();
    void result(int r);

public:
    Bar(Foo* foo);

private:
    Foo* foo_;

public:    
    template<typename Archive>
    void Dispatch(rpc_id_t id,Archive ar)
    {
        switch(id)
        {
        case 200:    return rpc::local::call(this,&this_t::ready,ar); //определяет тип аргументов по типу &this_t::ready
        case 201:    return rpc::local::call(this,&this_t::result,ar);
        }
        assert(0 && "invalid id");
    }
};

//.cpp
Bar::Bar( Foo* foo ) : foo_(foo) { ... }
void Bar::ready() {...}
void Bar::result( int r ) {...}


хотелось бы привести оба заголовка к общему виду, и спрятать строки которые можно спрятать
PM MAIL ICQ   Вверх
GoldFinch
Дата 9.8.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



upd: вместо
Код

class Bar
{
public:    
    typedef int rpc_id_t;
    typedef Bar this_t;

можно написать
class Bar : public rpc_cfg<Bar>
PM MAIL ICQ   Вверх
GoldFinch
Дата 9.8.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



upd2

template<typename Archive> 
void Bar::Dispatch(rpc_id_t id,Archive ar)

можно вынести из класса в отдельную функцию

template<typename idT, typename Archive>
void Dispatch(Bar* that, idT id, Archive ar)

тогда от .h файлов останется только

Код

class Bar : public rpc_remote_cfg<Bar>
{
public:
    void ready()        RPC_REMOTE_DECL( 200, ready )
    void result(int r)    RPC_REMOTE_DECL( 201, result )
};

и
Код

class Bar : public rpc_local_cfg<Bar>
{
public:
    void ready();
    void result(int r);

    Bar(Foo* foo);

private:
    Foo* foo_;
};

PM MAIL ICQ   Вверх
mes
Дата 9.8.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  9.8.2009,  14:11 Найти цитируемый пост)

разница между 
  DEF_RPC_CALL_2 (f, 8, int, int)
и 
  void f(int a, int b) DEF_RPC_CALL(8, f)
не слишком велика

разница в неиспользовании  AddressOfReturnAddress() и в отсутствии повторного дублирования имени функции.

Это сообщение отредактировал(а) mes - 9.8.2009, 17:55


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.8.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



mes, и еще во внешнем виде объявления, и необходимости подсчета числа параметров
аналог _AddressOfReturnAddress() есть и в gcc, так что это небольшое зло
PM MAIL ICQ   Вверх
GoldFinch
Дата 9.8.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Любитель @  9.8.2009,  13:50 Найти цитируемый пост)
Если ты хочешь использовать собственный протокол - то зачем нужна библиотека?!

чтобы был пример, вдруг я упустил какой-нибудь хорошой способ реализации
так например глядя на буст.сериализацию, я написал свою сериализацию
без аналога писать сложнее.
PM MAIL ICQ   Вверх
GoldFinch
Дата 10.8.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



неужели это такой 0day что нигде никаких аналогов нет %)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.