C ++中的并发TCP服务器

时间:2019-04-25 20:41:14

标签: c++ tcp concurrency server

我正在尝试使用线程创建并发的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              */


我同时使用两个客户端连接到服务器,并且希望循环能够同时通过两个新连接并为每个连接创建一个线程。到现在为止,它以延迟模式运行,一个被接受,另一个等待直到第一个完成。

有什么想法吗?

(请避免代码中的任何错误)

1 个答案:

答案 0 :(得分:1)

std::async返回一个std::future,该代码不会保存到变量中,因此将立即调用其析构函数。 std::future::~future()阻塞调用线程,直到将来准备就绪。

您可能希望使用(分离的)std::thread而不是std::async

有更多可扩展的策略可以处理许多客户。我强烈建议您阅读古老而有启发性的The C10K problem

您可能还想熟悉Asio C++ Library