Программный поток C ++: сокеты в объекте и основная функция - PullRequest
2 голосов
/ 09 июня 2010

У меня довольно сложная проблема, связанная с потоком программ на C ++ с использованием сокетов.

По сути, у меня есть следующее: простая серверная программа сокетов командной строки, которая прослушивает сокет и принимает по одному соединению за раз. Когда это соединение потеряно, оно открывается для дальнейших соединений.

Эта система сокетной связи содержится в классе. Класс полностью способен принимать соединения и зеркалировать данные, полученные клиенту. Однако в этом классе используются сокеты UNIX, которые не являются объектно-ориентированными.

Моя проблема в том, что в моей функции main () у меня есть одна строка - та, которая создает экземпляр этого объекта. Затем объект инициализируется и ждет. Но как только соединение установлено, функция инициализации объекта возвращается, и когда это происходит, программа завершает работу. Как мне как-то подождать, пока этот объект будет удален, прежде чем программа закроется?

Резюме:

  1. main () создает экземпляр объекта
  2. Объект слушает
  3. Соединение получено
  4. Функция инициализации объекта возвращает
  5. Основные () выходы (!)

Я хочу, чтобы main () каким-то образом задерживал, пока этот объект не завершит то, что он делает (он сам удалит себя), прежде чем завершится.

Есть мысли?

Ответы [ 5 ]

0 голосов
/ 09 июня 2010

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

0 голосов
/ 09 июня 2010

Если объект запускает поток, возможно, есть вероятность, что в API есть какой-то метод .wait (), или вы можете добраться до объекта внутреннего потока и сделать join ()?

Если нет, и вы не можете изменить API, тогда вам придется немного подождать (1) и поспать внутри ... и, возможно, не очень хорошо выглядит.

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

0 голосов
/ 09 июня 2010

Существует несколько возможных решений, но без дополнительной информации трудно решить, какое из них лучше в вашей ситуации.

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

Второй идеей было бы изменение идеи Джереми Фризнера с циклом while.Вы, кажется, возражаете против этого из-за эффективности.Мой совет: создайте что-то, что работает в первую очередь, а потом разберитесь с эффективностью.Чтобы сэкономить ресурсы, поместите вызов sleep () после конструктора.

0 голосов
/ 09 июня 2010

Я хочу, чтобы main () каким-то образом задерживала до тех пор, пока этот объект не закончил с тем, что он делает (иначе он сам удалит себя), прежде чем завершится. Мне кажется, что объект запускает поток.

Предполагая, что это так, у вас есть несколько вариантов:

  1. Вызовите pthread_join, чтобы дождаться завершения потока, запущенного объектом.
  2. Основной звонок pthread_exit. Это просто завершит поток вместо всего процесса.
0 голосов
/ 09 июня 2010

Было бы проще с уверенностью ответить, если вы разместили некоторый код, но это кажется достаточно простым ... добавьте цикл while (1) вокруг содержимого вашего main ():

int main(int, char **)
{
   while(1)
   {
      [...]
   }
}
...