在没有新连接的情况下,增强asio-acceptor解锁?

时间:2011-06-20 19:47:51

标签: c++ boost boost-asio

我正在使用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-&gt; blitzAcceptor.accept(soc,ec); ,并且每次建立新连接时都应该在 this-&gt中处理它; HandleRequest(soc); 并再次阻止 this-&gt; blitzAcceptor.accept(soc,ec);

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

这不会一直发生,但大部分时间都会发生。这种行为可能是什么原因,我怎样才能确保它始终阻止这个&gt; blitzAcceptor.accept(soc,ec)直到发出新请求?

2 个答案:

答案 0 :(得分:3)

  

这可能是什么原因   行为?

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

  

如何确保它始终阻止   at this-&gt; blitzAcceptor.accept(soc,ec)   直到提出新请求?

你做不到。但是,您的服务器可以启动在接受连接后立即启动的超时。如果客户端未在该持续时间内发送请求,请关闭套接字。为此,您应该切换到使用异步方法而不是同步方法。

答案 1 :(得分:1)

请确保您没有阻止read(2)调用listen(2)所针对的文件描述符与您accept(2)编辑的文件描述符。我想如果你打印出文件描述符编号,你很快就会发现问题。