Поэтому я пытаюсь создать сервер, который принимает соединения в сокете, затем создает поток вокруг выполнения функции, которая использует вновь открытый файловый дескриптор принятого соединения. Проблема, с которой я сталкиваюсь, заключается в том, что при запуске потока сервер возвращается, чтобы принять другое соединение (если оно есть), но оно не блокируется? он, кажется, возвращается из цикла, и я не знаю, почему он это делает. Выполняемый код:
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]
Но если принимать блоки в ожидании нового соединения в сокете, то как же программа завершается до того, как печатается "После принятия"?
Проблема в том, что вы уничтожаете свой поток мгновенно, не присоединяясь к нему:
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>>
чтобы выполнить одно и то же.
accept()
? Когда вы говорите «прекращает», кто это прекращает? Вы убиваете его или он умирает сам по себе?