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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чем парсить С/С++ код? 
V
    Опции темы
boostcoder
Дата 22.11.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(baldina @  22.11.2010,  18:53 Найти цитируемый пост)
в общем, конечно

это сложно..
вам нужно прочесть эту тему: http://forum.vingrad.ru/forum/topic-311688.html
 smile 

и глянуть исходники: http://code.google.com/p/discoly/source/checkout

правда.. сложно это все объяснить..
мы с mes`ом много на эту тему наобщались.

Добавлено через 9 минут и 25 секунд
Цитата(mes @  22.11.2010,  18:56 Найти цитируемый пост)
и две конечные точки общения (два простых класса между которыми происходит общение без учета возможной реализации) [как раз на этом мы вроде остановились в прошлой теме]

вот: http://code.google.com/p/discoly/source/br...client/main.cpp
сейчас еще пишу однопользовательский чат. как минималистичный пример.

Добавлено через 9 минут и 46 секунд
Цитата(boostcoder @  22.11.2010,  18:57 Найти цитируемый пост)
минималистичный

странное слово получилось smile

Добавлено через 11 минут и 12 секунд
baldina, хотя...mes Вам сможет лучше это все объяснить. если у него есть желание, конечно.
PM WWW   Вверх
mes
Дата 22.11.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



или можно зайти с другой стороны.. 
Код

struct auth_agent 
{
    void identify (const std::string& wish_name);
    void quit ();

    std::string ident_name () const { return _name; }
    bool has_ident () const { return _has_ident; }

   protected:
       void on_ident (const std::string& name) { has_ident = true; _name = name; }
       void on_quit  () { has_ident = false; _name = ""; }

   private:
      std::string    _name;
      bool _has_ident;
};

Код

struct auth_service 
{
     void on_ident_query (const std::string& wish_name)
     {
          agent().on_ident(wish_name);
     }
     void on_quit_query (const std::string& wish_name)
     {
          agent().on_quit();
     }
};

вот простой пример.. допустим оба класс входят в состав одного приложения.. что надо сделать чтоб они заработали ?

При этом должна остаться возможность исключить класс auth_service  путем замыкания методов auth_agent`a друг на друга..

Добавлено через 2 минуты и 28 секунд
Цитата(boostcoder @  22.11.2010,  17:57 Найти цитируемый пост)
хотя...mes Вам сможет лучше это все объяснить. если у него есть желание, конечно.

на том моменте, где мы закончили тему.. я сам не до конца понимаю в какую сторону Вы тяните smile

Добавлено через 3 минуты и 11 секунд
Цитата(boostcoder @  22.11.2010,  17:57 Найти цитируемый пост)
вот: http://code.google.com/p/discoly/source/br...client/main.cpp
сейчас еще пишу однопользовательский чат. как минималистичный пример.

уже скоро уходить.. гляну чуть позже.. 

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


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


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(mes @  22.11.2010,  19:11 Найти цитируемый пост)
допустим оба класс входят в состав одного приложения.. что надо сделать чтоб они заработали ?

присвоить классам/методам ID`ы. зарегать методы по ID`ам.

PM WWW   Вверх
baldina
Дата 22.11.2010, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



boostcoder, я ту тему читал. местами. слишком многа букаф))
если я правильно понял, ведется разработка чего-то клиент-серверного, типа RPC: сервер умеет методы, клиент должен их вызывать, причем заранее все методы неизвестны, но вызов на клиенте должен органично вписываться в код.
подобное уже делали, напр. CORBA, COM.

то, что в том топике, мне ясно. и ответы на заданные вопросы тоже (скажу тут, что бы туды-сюды не бегать):
Цитата

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

сервер. что ему знать зависит от реализации. например, уникальный ID метода. ну, это Вы сами ответили.
клиент. ему надо знать перечень ID и передавать их на сервер.
это просто, но не могу не удержаться от замечания. подобные вещи - "сервер публикует список идентификаторов методов; клиент передает идентификатор для вызова метода сервера; сервер по идентификатору определяет метод и вызывает его; сервер проверяет корректность вызова по числу и типу параметров" и т.д. определяются до реализации, это часть постановки задачи.

теперь к нашим баранам. я чуть догадываюсь, к чему код примера в этом топике, но хотелось бы послушать первоисточник.

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

// декларация интерфейса некоторого типа.
INTERFACE_BEGIN(transaction_type)
   METHOD(
      std::string, // ret
      login, // method name
      std::string, // method arg
      std::string // method arg
   )
   METHOD(
      std::string, // ret
      get_balance, // method name
      std::string, // method arg
      std::string // method arg
   )
INTERFACE_END()
// код клиента
client<transaction_type> client(host, port);
std::string ret = client.login("nick", "pass");
ret = client.get_balance("date from", "date to");

не вижу абсолютно ничего, что мешало бы так делать клиенту.
декларация интерфейса выглядит несколько громоздко...
можно сделать так:
Код

struct transaction_type : public interface {
  method<std::string(std::string,std::string)> login;
  method<std::string(std::string,std::string)> get_balance;
};


Добавлено через 6 минут и 31 секунду
забыл: методы надо с сервером связывать. значит как-то указывать идентификатор, типа
Код

method<RPID_LOGIN, std::string(std::string,std::string)> login;

PM MAIL   Вверх
baldina
Дата 22.11.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



кажись не там я читал. вот оно:
Цитата

предполагаю реализовать раздельную генерацию кода для клиента и сервера. будут использоваться два зарезервированных ключевых слова: server_side и client_side

а что если
Код

template <int id>
struct method {
  method ()
  {
     register (id); // реализация register отличается для сервера и клиента
  }
};

struct interface; // реализация interfaceотличается для сервера и клиента
struct some_interface : public interface {
  method<1> m1;
  method<2> m2;
};

заголовок один, сервер это или клиент определяется во время компиляции

Добавлено через 41 секунду
мысль забурлила  smile 
пойду полезным займусь, вернусь позже
PM MAIL   Вверх
boostcoder
Дата 22.11.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(baldina @  22.11.2010,  20:20 Найти цитируемый пост)
подобное уже делали, напр. CORBA, COM.

угу.

Цитата(baldina @  22.11.2010,  20:20 Найти цитируемый пост)
определяются до реализации, это часть постановки задачи

определяются кем? прогером? вручную? smile 
у меня же, это обязанность метагенератора.

Цитата(baldina @  22.11.2010,  20:20 Найти цитируемый пост)
допустим есть код

от этого кода я давно ушел.
да, когда-то метагенератор был написан на препроцессоре. но с расширением потребностей, от препроцессорного метагенератора пришлось отказаться. некоторые моменты с его помощью не реализуемы.

Цитата(baldina @  22.11.2010,  20:20 Найти цитируемый пост)
не вижу абсолютно ничего, что мешало бы так делать клиенту.

и это в далеком прошлом.
сейчас, клиент/сервер получают интерфейс для нужной реализации, и с помощью этого интерфейса общаются с реализацией.

Добавлено через 4 минуты
Цитата(baldina @ 22.11.2010,  20:37)
кажись не там я читал. вот оно:
Цитата

предполагаю реализовать раздельную генерацию кода для клиента и сервера. будут использоваться два зарезервированных ключевых слова: server_side и client_side

а что если
Код

template <int id>
struct method {
  method ()
  {
     register (id); // реализация register отличается для сервера и клиента
  }
};

struct interface; // реализация interfaceотличается для сервера и клиента
struct some_interface : public interface {
  method<1> m1;
  method<2> m2;
};

заголовок один, сервер это или клиент определяется во время компиляции

Добавлено @ 20:38
мысль забурлила  smile 
пойду полезным займусь, вернусь позже

а теперь представьте...5-20 классов(каждого от 5ти методов), и соответственно 5-20 интерфейсов. и еще не забудьте, что все это назначать вам придется в ручную.
PM WWW   Вверх
boostcoder
Дата 22.11.2010, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



вот общий пример.
все просто. ничего лишнего.
Код


#include "decl1.hpp"

/***************************************************************************/

namespace discoly {
namespace impl {

struct client_side: i_client_side {
   client_side(detail::distributor& d):i_client_side(d) {}

   void set_int(int i) {
      std::cout << "client_side::set_int(" << i << ");" << std::endl;
   }

   void set_string(const std::string& s) {
      std::cout << "client_side::set_string(" << s << ");" << std::endl;
   }

   int get_int() {
      std::cout << "client_side::get_int();" << std::endl;
      return time(0);
   }
};

/***************************************************************************/

struct server_side: i_server_side {
   server_side(detail::distributor& d):i_server_side(d) {}

   void set_int(int i) {
      std::cout << "server_side::set_int(" << i << ");" << std::endl;
   }

   void set_string(const std::string& s) {
//      std::cout << "server_side::set_string(" << s << ");" << std::endl;
   }
};

} // namespace impl;
} // namespace discoly

typedef boost::mpl::vector<discoly::impl::client_side> client_metacontainer;
typedef boost::mpl::vector<discoly::impl::server_side> server_metacontainer;
/***************************************************************************/

void ping_time(boost::uint32_t pt) {
   std::cout << "ping time = " << pt << std::endl;
}

void query_timeout() {
   std::cout << "query_timeout" << std::endl;
}

std::string mega_string(boost::uint32_t size) {
   std::string res;
   for ( boost::uint32_t idx = 0; idx < size; ++idx ) {
      res += "abcdefghi1234567890k";
   }
   return res;
}

/***************************************************************************/

void client_disconnect() {
   std::cout << "client receive disconnect" << std::endl;
}
void server_disconnect() {
   std::cout << "server receive disconnect" << std::endl;
}

void as_callback() {
   std::cout << "as_callback()" << std::endl;
}

/***************************************************************************/

using namespace discoly;
int main() {
   try {
      const boost::uint16_t port = 44550;
      net_server<server_metacontainer> server(port);
      server.set_ping_callback(ping_time);
      server.set_on_disconnect(server_disconnect);
      ifaces::client_side::shared_ptr c = server.get<ifaces::client_side>();

      net_client<client_metacontainer> client("127.0.0.1", port);
      client.set_ping_callback(ping_time);
      client.set_on_disconnect(client_disconnect);
      ifaces::server_side::shared_ptr s = client.get<ifaces::server_side>();
      for ( size_t count = 0; true; ++count ) {
         s->set_int((int)time(0));
         s->set_string("33");

         c->set_int((int)time(0)+10);
         c->set_string("44");

         if ( count == 10 ) {
            client.disconnect();
         }

         if ( count == 5 ) {
            std::vector<std::string> services = client.query_services(query_timeout);
            std::copy(services.begin(), services.end(), std::ostream_iterator<std::string>(std::cout, ", "));
            std::cout << std::endl;
         }
         if ( count % 3 ) {
            s->set_string(mega_string(100));
         }

         if ( count % 7 ) {
            client.disconnect();
            server.disconnect();
         }

         c->get_int();
//         int v1 = c->get_int().as<int>(as_callback);
//         std::cout << "v = " << v1 << std::endl;

//         boost::uint64_t v2 = c->get_int();
//         boost::uint32_t v3 = c->get_int();

         boost::this_thread::sleep(boost::posix_time::milliseconds(1));
      }
   } catch ( const std::exception& e ) {
      std::cout << "int main(): " << e.what() << std::endl;
   } catch ( ... ) {
      std::cout << "int main(): unknown exception" << std::endl;
   }
}

/***************************************************************************/

вверху реализации классов клиента и сервера.
так же, обратите внимание на:
Код

ifaces::client_side::shared_ptr c = server.get<ifaces::client_side>();

так получаем интерфейс для реализации client_side. т.е. работаем с полученным интерфейсом, как будто с указателем на реализацию.
но сами интерфейсы тоже генерит метагенератор. и там не мало кода. пусть и не сложного, но рутинного. и писать его для кучи классов/методов мало кому интересно.
PM WWW   Вверх
mes
Дата 23.11.2010, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  22.11.2010,  20:21 Найти цитируемый пост)
все просто. ничего лишнего.

наличие net_servera и net_clienta уже лишнее.. библиотека не должна зависить от того находятся ли два класса в одном приложении или на концах сети.. 

Цитата(boostcoder @  22.11.2010,  20:21 Найти цитируемый пост)
так получаем интерфейс для реализации client_side. т.е. работаем с полученным интерфейсом, как будто с указателем на реализацию.

но почему client_side является, как вы говорите, зарезервированным ? допустимее что будет 
client_facet_1, client_facet_2, client_facet_3.. 

сам код пока не смотрел.. 



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


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(mes @  23.11.2010,  00:09 Найти цитируемый пост)
наличие net_servera и net_clienta уже лишнее.. библиотека не должна зависить от того находятся ли два класса в одном приложении или на концах сети.. 

она и независит. укажите этим классам другие IP/port и поведение будет то же.

Цитата(mes @  23.11.2010,  00:09 Найти цитируемый пост)
но почему client_side является, как вы говорите, зарезервированным ?

это просто ключевое слово. можно назвать по другому. не в этом суть.

Цитата(mes @  23.11.2010,  00:09 Найти цитируемый пост)
client_facet_1, client_facet_2, client_facet_3.. 

ну и?
PM WWW   Вверх
mes
Дата 23.11.2010, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  23.11.2010,  00:41 Найти цитируемый пост)
она и независит. укажите этим классам другие IP/port и поведение будет то же.

а если совсем без сокетов ?

Цитата(boostcoder @  23.11.2010,  00:41 Найти цитируемый пост)
это просто ключевое слово. можно назвать по другому. не в этом суть.

ну так я и не к самому названию цепляюсь.. у вас деление на клиент/сервис идет между объектами или приложениями ?





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


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(mes @  23.11.2010,  01:52 Найти цитируемый пост)
а если совсем без сокетов ?

как тогда им общаться?
Цитата(mes @  23.11.2010,  01:52 Найти цитируемый пост)
у вас деление на клиент/сервис идет между объектами или приложениями ?

ни так, и ни так.
эти ключевые слова используются только для раздельной генерации.
PM WWW   Вверх
boostcoder
Дата 23.11.2010, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



baldina, в контексте данной темы, обсуждение RPC/CORBA выглядит свалившимся с луны.
если есть желание, присоединяйтесь: http://forum.vingrad.ru/forum/topic-311688.html

PM WWW   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0787 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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