我正在尝试使用线程创建并发c ++ TCP服务器。特别是我想知道我是否可以使用std :: async接受连接并在其自己的线程中为每个连接提供服务。
到目前为止,我已经创建了一个粗略的模型,但无法确定我是否在正确的路径上。
void networking::TCP_Server::acceptConnection() {
std::string stringToSend{"This is a test string to be replied to"};
int new_fd = accept(listeningFD, nullptr, nullptr);
send(new_fd, stringToSend.c_str(), stringToSend.size(), 0);
sleep(3);
std::cout << ("End of thread");
}
///LISTEN FOR CONNECTIONS ON listeningFD
///CREATE A LIST OF FILE DESCRIPTORS FOR POLL fds[]
(fds[i].fd == listeningFD) {
do {
std::cout << ("New incoming connection - %d\n", new_fd);
std::async(std::launch::async, acceptConnection)
} while (new_fd != -1);
} /* End of existing connection is readable */
} /* End of loop through pollable descriptors */
我同时连接到具有两个客户端的服务器,并期望循环运行两个新连接并为每个连接创建一个线程。截至目前,它是在延迟模式下运行,一个被接受,另一个等到第一个完成。
有任何想法吗?
(原谅代码中的任何错误)
std::async
返回一个std::future
,代码不会保存到变量中,因此会立即调用它的析构函数。 std::future::~future()
阻止调用线程,直到未来准备就绪。
您可能想使用(分离的)std::thread
而不是std::async
。
有更多可扩展的策略来处理许多客户端。我强烈建议阅读旧的但有教育意义的The C10K problem。
您可能也想熟悉qazxsw poi。