【问题标题】:Boost asio-acceptor unblocks without a new connection?在没有新连接的情况下提升 asio-acceptor 解锁?
【发布时间】:2014-01-07 04:03:25
【问题描述】:

我正在使用 C++ boost asio 库,我在其中侦听套接字上的新连接。在获得连接后,我处理请求,然后在循环中侦听另一个套接字上的新连接。

while (true)
{
    tcp::socket soc(this->blitzIOService);
    this->blitzAcceptor.listen();
    boost::system::error_code ec;
    this->blitzAcceptor.accept(soc,ec);
    if (ec)
    {
        // Some error occured
        cerr << "Error Value: " << ec.value() << endl;
        cerr << "Error Message: " << ec.message() << endl;
        soc.close();
        break;
    }
    else
    {
        this->HandleRequest(soc);
        soc.shutdown(tcp::socket::shutdown_both);
        soc.close();
    }
}

据我了解,它应该始终在 this->blitzAcceptor.accept(soc,ec); 处阻塞,并且每次建立新连接时,它都应该在 this->HandleRequest 中处理它(soc); 并再次在 this->blitzAcceptor.accept(soc,ec);

处阻止

但我看到的是,它第一次会在 this->blitzAcceptor.accept(soc,ec) 处阻塞,当建立新连接时它会处理请求,但是而不是在 this->blitzAcceptor.accept(soc,ec) 再次阻塞,它将继续进入 this->HandleRequest(soc); 并在 soc 阻塞.receive(); 里面。

这并不总是发生,但大部分时间都会发生。这种行为可能是什么原因,我如何确保它始终在 this->blitzAcceptor.accept(soc,ec) 处阻塞,直到发出新请求?

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    这可能是什么原因 行为?

    此行为完全取决于客户端代码。如果它连接了,但没有发送请求,则服务器在接收数据时阻塞。

    我怎样才能确保它总是阻塞 在这个->blitzAcceptor.accept(soc,ec) 直到提出新的请求?

    你不能。但是您的服务器可以在接受连接后立即启动超时。如果客户端在这段时间内没有发送请求,则关闭套接字。为此,您应该改用异步方法而不是同步方法。

    【讨论】:

    • 谢谢。您的解释“此行为完全取决于客户端代码。如果它连接但不发送请求,则服务器在接收数据时会阻塞。”是正确的。我正在编写一个 Http 服务器,并认为浏览器只有在发出新请求时才会建立新连接。在这里,我注意到它确实建立了一个新的连接,而没有任何发送请求。截至目前,我为请求提供服务并关闭连接。也许出于这个原因,它建立一个新的连接只是作为一种优化。
    【解决方案2】:

    请确保您没有阻塞 read(2) 调用您正在使用的文件描述符 listen(2)' 与您 accept(2)'ed 的文件描述符。我想如果你打印出文件描述符编号,你会很快找到你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 2013-05-07
      • 2020-05-22
      • 1970-01-01
      相关资源
      最近更新 更多