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->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.rereceive()处进行阻塞内部。

这种情况并不总是发生,但大多数时候都会发生。这种行为的原因是什么?我如何确保它总是在这个->blitzAcceptor.accept(soc,ec)处阻塞,直到发出新的请求?

这可能是什么原因行为

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

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

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

请确保您没有阻止对listen(2)'正在使用的文件描述符的read(2)调用,而不是对accept(2)'编辑的文件描述符。我认为,如果你打印出文件描述符编号,你会很快发现你的问题。

最新更新