gpt4 book ai didi

c++ - Boost asio-acceptor 在没有新连接的情况下解锁?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:09 27 4
gpt4 key购买 nike

我正在使用 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) 直到发出新请求?

最佳答案

What could be the reason to this behavior?

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

how can I ensure that it always block at this->blitzAcceptor.accept(soc,ec) until a new request is made?

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

关于c++ - Boost asio-acceptor 在没有新连接的情况下解锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416604/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com