我正在尝试使用线程创建并发的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 */
我同时使用两个客户端连接到服务器,并且希望循环能够同时通过两个新连接并为每个连接创建一个线程。到现在为止,它以延迟模式运行,一个被接受,另一个等待直到第一个完成。
有什么想法吗?
(请避免代码中的任何错误)
答案 0 :(得分:1)
std::async
返回一个std::future
,该代码不会保存到变量中,因此将立即调用其析构函数。 std::future::~future()
阻塞调用线程,直到将来准备就绪。
您可能希望使用(分离的)std::thread
而不是std::async
。
有更多可扩展的策略可以处理许多客户。我强烈建议您阅读古老而有启发性的The C10K problem。
您可能还想熟悉Asio C++ Library。