LINUX.ORG.RU

Сообщения hound

 

Передача параметров из одного класса в другой

Приветствую. Есть класс-сервер, в котором при подключении нового клиента создается объект-клиент для каждого подключения. В классе клиента идет обработка каких-нибудь данных и прочее и обработанные данные надо как-то передать или классу-сервера и еще куда либо. Сейчас использую интерфейсы, к примеру, как-то так:

class IServer
{
  virtual void setData(int newData) = 0;
}

class CClient
{
public:
  CLient(IServer *parent): m_parent(parent) {}
private:
   IServer *m_parent;
  void processData()
  {
     parent->setData(data);
  }
}

класс-сервера:

class CServer : public IServer
{
public:
  CServer() {}
  void setDate(int newData) {/*do smth*/}
  void newConnection();
}

void CServer::newConnection()
{
  CClient *client = new CClient(this);
  /* do smth */
}

На сколько такой вариант оправдан?

 

hound
()

Route png

Добрый день, кто-нибудь сталкивался с вопрос создания маршрута на карте по средством создания png изображения и последующим его наложением уже на карту? Смысл в том, чтобы не отправлять на клиент огромный массив из координат и не рисовать сам маршрут на клиенте. В какую сторону копать, есть ли уже готовые либы и т.п?

 ,

hound
()

Подгрузка библиотеки «на лету»

Добрый вечер, есть приложение, которое со временем будет дополняться новыми функциями выделенными в отдельный модуль. Грубо говоря, в каждом новом модуле будет новый парсер файлов. (Разные форматы файлов и т.п) Возможно ли сделать что-то на подобии динамической подгрузки этих библиотек без перекомпиляции основной программы? Скопировали новый модуль, перезапустили приложение, оно увидело наличие нового модуля, подгрузило его функционал и теперь может разбирать новый формат файла, как-то так.

 

hound
()

C,TCP-Server

Добрый вечер, есть TCP сервер на си с libevent, к нему переодически подключаются некоторые девайсы (у каждого девайса свой идентификатор), сервак разбирает сообщения от девайсов и отдельном процессе шлет данные в стороний сервис (вида: ИДЕНТИФИКАТОР+еще какие-то данные). этот сервис в свою очередь передают информацию по вэб сокетам клиенту в браузер, дальше клиент видит, что некий девайс в данный момент «в сети» и может отправить ему какое-нибудь сообщение, это сообщение так же через вэб сокеты передается второму сервису, который в свою очередь передает данные сишному серверу (вида ИДЕНТИФИКАТОР+текст сообщения). Вопрос, как заставить тсп сервер сразу отправить это сообщение девайсу? Как вариант входящие сообщения от второго сервиса складывать в очередь и при новом сообщении от девайса проверять в этой очереди наличие сообщения. но такой способ будет работать с задержкой, т.к новое сообщение от девайса может придти через 5,10 минут. Второй вариант: сделать третий процесс (1-ый процесс это сам приемник сообщений от девайсов, 2-ой передача сторонему сервису инфу о новых подключениях/отключениях) и в нем в бесконечном цикле перебирать наличие в очереди сообщений для девайсов и если есть сообщение, то перебирать уже очередь «активных» девайсов и при совпадении отправлять сообщение...но это цикл в цикле и если активных девайсов и сообщений будет много, то как мне кажется будет не совсем правильно... Кто-нибудь реализовывал подобные вещи, что можете посоветовать? Заранее Спасибо.

 , ,

hound
()

valgrind ругается на запись в структуру

Всем добрый вечер.

Имеем: связанный список, например такой структуры:

typedef struct t_t_buffer_list_data {
  uint8_t *data;
  uint16_t data_len;
  uint32_t id;
  
  struct t_t_buffer_list_data *next;
  
} t_buffer_list_data;
И вторую структуру:
typedef struct {
  t_buffer_list_data *first; //указатель на первую структуру в списке
  t_buffer_list_data *last; // соответственно на последную
  
  uint32_t count;     //общее кол-во структур
} t_buffer_list_main;

Вторая структура для удобства, чтобы указатели и кол-во было упаковано. Определяется глобальная переменная для этого модуля:

buffer_list_main t_buffer_list_main;
Итак, в общем во всей работе с этими списками есть такая функция, которая в переменной buffer_list_main меняет значение указателя на последний элемент в списке:
t_buffer_list_data *buffer_list_add_item(t_buffer_list_data * last, uint8_t *data, uint16_t data_size, uint32_t id) {
  t_buffer_list_data *buffer_list_data;

  buffer_list_main.count++;
  buffer_list_data = (t_buffer_list_data*)malloc(sizeof(t_buffer_list_data));
  buffer_list_data->data = malloc(data_size);
  buffer_list_data->next = NULL;
  buffer_list_data->data_len = data_size;
  buffer_list_data->session_id = session_id;

  memcpy(buffer_list_data->data, data, data_size);
  
  if (buffer_list_main.last != NULL) {
    buffer_list_main.last->next = buffer_list_data;
  }

  return buffer_list_data;
}
НО! valgrind ругается на эту строчку:
buffer_list_main.last->next = buffer_list_data;
пишет: Invalid write of size 8 at 0x40577F: buffer_list_add_item (buffer_list.c:53)

Там дальше и другие есть названия функций по списку... но трабла именно в этом присвоении - коментил ругаться valgrind перестает. В общем, решил убрать buffer_list_main и вынести из структуры указатели на первый и последний элементы, ругань прошла. Может кто подскажет из-за чего такое происходит? выравнивание делал на всякий случай. Заранее благодарен! И да система убунту 12.01 gcc 4,6,3.

 ,

hound
()

RSS подписка на новые темы