Программа завершает начальный поток после accept ()

0

Поэтому я пытаюсь создать сервер, который принимает соединения в сокете, затем создает поток вокруг выполнения функции, которая использует вновь открытый файловый дескриптор принятого соединения. Проблема, с которой я сталкиваюсь, заключается в том, что при запуске потока сервер возвращается, чтобы принять другое соединение (если оно есть), но оно не блокируется? он, кажется, возвращается из цикла, и я не знаю, почему он это делает. Выполняемый код:

listen(sockfd,10);
int i = 0;
for(;;)
{
    std::cout << "Before accept" << endl;
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    std::cout << "After accept" << endl;

    if (newsockfd < 0)
    {
        std::cout << newsockfd << ": Error on accept" << endl;
        continue;
    }
    else
        std::cout << newsockfd << ": Connection accepted!" << endl;

    boost::thread(boost::bind(&Class::FunctionToRun, this, newsockfd)).start_thread();
    std::cout << ++i << endl;
}

Выход на консоль:

Socket opened! fd = 3
Before accept
After accept
4: Connection accepted!
1
Before accept
[program terminates]

Но если принимать блоки в ожидании нового соединения в сокете, то как же программа завершается до того, как печатается "После принятия"?

  • 0
    Сбой процесса?
  • 0
    Разве вы не хотите, чтобы он вернулся и снова accept() ? Когда вы говорите «прекращает», кто это прекращает? Вы убиваете его или он умирает сам по себе?
Показать ещё 2 комментария
Теги:
sockets

1 ответ

1
Лучший ответ

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

    boost::thread(boost::bind(&Class::FunctionToRun, this, newsockfd)).start_thread();
    // already dead here
    std::cout << ++i << endl;
}

Если вы хотите, чтобы ваши потоки зависали, вам нужно где-то их хранить:

std::vector<std::unique_ptr<boost::thread>> threads;
for (;;) {
    // ...
    threads.emplace_back(new boost::thread(boost::bind(...)));
    // thread is still alive here
    std::cout << ++i << endl;
}

Если не С++ 11, вы можете сделать его vector<boost::shared_ptr<boost::thread>> чтобы выполнить одно и то же.

  • 0
    Я не хочу, чтобы мои темы болтались. Я хочу, чтобы они начали как можно скорее.
  • 1
    @Stapps Они начнутся, как только вы создадите их - вам просто нужно, чтобы объект висел вокруг, иначе он будет разрушен ... и вы не хотите, чтобы он разрушался до тех пор, пока вы не закончили.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню