繁体   English   中英

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

[英]Boost asio-acceptor unblocks without a new connection?

我正在使用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();
    }
}

根据我的理解,它应该总是阻止这个 - > blitzAcceptor.accept(soc,ec); 每次建立新连接时,都应该在this-> HandleRequest(soc)中处理它; 并再次阻止此 - > blitzAcceptor.accept(soc,ec);

但我所看到的是,它首次会阻止此 - > blitzAcceptor.accept(soc,ec),并且当建立新连接时它将处理请求,而不是再次阻止此 - > blitzAcceptor。接受(soc,ec)它会继续进入这个 - > HandleRequest(soc); 并阻止在soc.receive(); 内。

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

这种行为可能是什么原因?

此行为完全取决于客户端代码。 如果它连接,但不发送请求,则服务器在接收数据时使用块。

我怎样才能确保它始终阻止此 - > blitzAcceptor.accept(soc,ec)直到发出新请求?

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

确保你没有阻止read(2)调用你正在listen(2)文件描述符listen(2)和你accept(2)文件描述符accept(2) 'ed。 我想如果你打印出文件描述符编号,你很快就会发现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM