【发布时间】:2020-05-12 19:57:51
【问题描述】:
这个问题主要是针对 boost::asio 的,但是socket 标签上的问题可能会对有关accept 调用的暂时性故障有所了解。
在 Boost::Asio 中,如果我有一个套接字接受器编码为持续接受新连接。
void Acceptor::StartNextAccept()
{
// _acceptor is of type boost::asio::ip::tcp::acceptor
_acceptor->async_accept([this](const boost::system::error_code& ec, boost::asio::ip::tcp::socket sock) {
if (ec)
{
// error
LogErrorCode(ec);
}
else
{
// success
HandleNewConnection(s);
}
StartNextAccept(); // enqueue another accept call regardless of success or error case
});
}
我担心的是,如果接受器套接字进入错误状态,上述代码将处于无限循环中,不断记录故障,将新尝试排入队列,无限循环。因此,不必要地烧掉内核并填充日志文件。
哪个是更好的假设:
async_accept 调用不应在有效套接字上失败。不用担心上面的代码,因为您在初始化套接字时仔细检查了错误并测试了您的代码。
async_accept 调用可能会失败,但重试它们毫无意义,因此只需关闭此套接字并退出重试循环。
async_accept 调用可能会出现暂时性故障。检查错误 代码来确定是否值得重试。
如果上面的 #3 是正确的假设,建议检查哪些错误代码?如果错误是暂时的(例如机器资源不足、句柄不足等),在重试之前等待几秒钟以使线程不会烧毁内核是否有意义?
更新:物有所值。我的主要平台是 Mac 和 Windows 10。
【问题讨论】:
标签: sockets boost-asio