【问题标题】:Check if basic_socket_acceptor is ready to accept检查 basic_socket_acceptor 是否准备好接受
【发布时间】:2017-12-16 22:22:48
【问题描述】:

我正在使用Networking TS 编写一个简单的单线程 TCP 服务器。为了接受传入的连接,我创建std::experimental::net::ip::tcp::acceptor 并调用accept 成员函数。但是如果没有连接可以接受,它会阻塞,我不希望这样。如何检查 acceptor 是否准备好接受?

【问题讨论】:

  • 我不习惯使用实验性功能,但是在好的旧套接字 API 中,可以使用 select 来了解正在侦听的套接字是否有挂起的连接。实验性的 C++ API 可能有一个方法。
  • 我猜你使用的 API 是基于 boost::asio?如果是这样,我希望也会有一个asynchronous version of accept
  • @SergeBallesta 是的,我知道。
  • @G.M.但这不需要一个单独的线程来等待新的连接吗?我想让事情尽可能简单,并且只使用一个线程。
  • 不一定。底层实现很可能使用select 系统调用(如@SergeBallesta 所暗示的那样)。您能否提供有关您要实现的目标的更多信息。或者,更好的是,提供一个复制问题的minimal reproducible example

标签: c++ sockets networking


【解决方案1】:

显然,如果有一个函数最终会调用select,它将公开一个race condition。正确的做法是设置acceptor为非阻塞。

std::experimental::net::io_context context;
std::experimental::net::ip::tcp::acceptor acceptor{context,
    std::experimental::net::ip::tcp::endpoint{
    std::experimental::net::ip::tcp::v4(), 1234}};
acceptor.non_blocking(true);
std::error_code error;
while (true)
{
    auto socket = acceptor.accept(error);
    if (!error)
    {
        // Handle incoming connection
    }
    // Do other stuff
}

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2019-08-20
    • 2014-06-30
    相关资源
    最近更新 更多