Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2014, 15:58   #1
Xuch
Пользователь
 
Регистрация: 25.03.2013
Сообщений: 36
Злость [GLIB] Очень нужна помощь с GMainLoop

Здравствуйте!
Очень нужна помощь с GLib.
Есть GMainLoop - там основной цикл программы, к нему добавлен таймер, по которому осуществляются некоторые действия. Все работало прекрасно, пока я не добавил слушающий сокет - теперь как только подключается клиент, пока он не отключится - таймер не срабатывает. Понимаю, что нужно как-то другим потоком прикрутить к основной GMainLoop, но как непонятно, т.к. в официальной документации только краткий абзац и далее описание функций, которое не помогает понять как организовать процесс в целом.
Исходная часть:
Код:
  MainLoop = g_main_loop_new(NULL, FALSE);
  g_timeout_add_seconds(Interval, TimeoutCallback, (gpointer) Rec);
  g_main_loop_run(MainLoop);
Слушающий сокет:
Код:
  listenfd = TcpListen(host, port, &addr_len);
  in = g_io_channel_unix_new(listenfd);
  g_io_add_watch(in, G_IO_IN, (GIOFunc) Handler, (gpointer) Rec);
Помучив документацию по GLib код несколько видоизменился, однако по-прежнему ничего не работает...
Код:
   gpointer ControlServer::GThSocket(gpointer data)
     {
       int listenfd;
       socklen_t addr_len;
       GIOChannel *Channel;
       GSource *Source;
       GMainContext *Context;

      ControlServer *Srv = (ControlServer *) data;
      Context = g_main_context_new();
      listenfd = Srv->TcpListen(Srv->host, Srv->port, &addr_len);
      Channel = g_io_channel_unix_new(listenfd);
      Source = g_io_create_watch(Channel, G_IO_IN|G_IO_ERR);
      g_source_set_funcs(Source, &GThSourceFuncs);
      g_source_set_callback(Source, (GSourceFunc) Handler, (gpointer) Srv->Rec, NULL);
      g_source_attach(Source, Context);
      g_source_unref(Source);
      return NULL;
     }
Код:
    int ControlServer::GThStart()
     {
      GError *error = NULL;
      GThread *thread;

      g_thread_init(NULL);
      thread = g_thread_create(GThSocket, this, TRUE, &error);
      g_thread_join(thread);
      return 0;
     }
На данный момент проблема в том, что клиент не может подключиться к серверу, хотя при запуске программы через netstat я вижу, что целевой порт слушается. Видимо проблема где-то начиная с g_io_create_watch(), так как если я ее меняю на g_io_add_watch(), то сервер начинает работать. Но в этом случае при подключении клиента у меня отваливается таймер на gmainloop, а когда клиент отключается функция-callback таймера выполняется столько раз, сколько таймер срабатывал за время подключения клиента.

Привожу также код обработчика:,
Код:
bool ControlServer::Handler(GIOChannel *in, GIOCondition condition, gpointer data)
{
  Recorder *Rec = (Recorder *) data;
  struct sockaddr_storage income;
  int insock, newsock;
  socklen_t income_len;
  struct sockaddr peer;
  socklen_t size;
  Access *access;

  insock = g_io_channel_unix_get_fd(in);
  income_len = sizeof(income);
  newsock = accept(insock, (struct sockaddr *) &income, &income_len);
  size = sizeof(peer);
  getpeername(newsock, &peer, &size);
  struct sockaddr_in *ipv4 = (struct sockaddr_in *) &peer;
  access = new Access(newsock, ipv4, MAXN);

  access->Cycle(Rec);

  delete access;
  return true;
}
Access - это класс, который получает сокет клиента, проверяет права доступа и осуществляет протокольный обмен с клиентом.
access->Cycle(Rec) - это бесконечный цикл до того времени, пока клиент или сервер не закроют соединение.

Получается ни один вариант неработоспособен.
Буду рад любым идеям!
Спасибо!
Xuch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень нужна помощь c матрицами, макросами в Excel. Заранее благодарен(поверьте, очень-очень нужна помощь) Farridjan Помощь студентам 1 03.07.2009 12:24
Очень нужна помощь с написанием программы... срочно(буду благодарен за помощь) 5Paladin5 Помощь студентам 3 02.07.2009 09:12
Очень нужна помощь! Нужно найти ошибку в очень простой программе. Lex55555777 Помощь студентам 3 07.12.2008 20:32