Sockets accept套接字是否会出现暂时性故障';值得一试吗?
这个问题主要针对boost::asio,但是那些位于Sockets accept套接字是否会出现暂时性故障';值得一试吗?,sockets,boost-asio,Sockets,Boost Asio,这个问题主要针对boost::asio,但是那些位于套接字标签上的问题可能会对有关接受调用的瞬时故障有所了解 在Boost::Asio中,如果我有一个套接字接受器编码为持续接受新连接 void Acceptor::StartNextAccept() { // _acceptor is of type boost::asio::ip::tcp::acceptor _acceptor->async_accept([this](const boost::system::erro
套接字
标签上的问题可能会对有关接受
调用的瞬时故障有所了解
在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
});
}
我担心的是,如果接受方套接字进入错误状态,上述代码将处于一个无限循环中,不断记录失败,无限期地排队等待新的尝试。因此,不必要地烧掉内核并填充日志文件
哪一个假设更好:
更新:为了它的价值。我的主要平台是Mac和Windows 10。网络层是否存在值得重试的暂时性问题?对 但是,linux
accept
错误是从挂起的连接列表(backlog)返回的,而BSD则直接报告这些错误
Asio的async_connect
不适用的其他条件包括EWOULDBLOCK
/EAGAIN
,EFAULT
有关相应的error\u code
名称,请参见boost::asio::error
:
否则,请仔细查看系统错误列表,看看哪些错误值得明确处理
在我的代码中,我通常只是结束链:
_acceptor->async_accept([this](const boost::system::error_code& ec, boost::asio::ip::tcp::socket sock) {
if (ec) {
LogErrorCode(ec);
} else {
HandleNewConnection(s);
StartNextAccept();
}
});
我的服务器只需重新初始化侦听器(acceptor
在Asio中)。当然,这本身可能会失败,服务器可能会关闭
您可能有QoS要求,也可能没有QoS要求,提示您以不同的方式处理个别情况
最终,重新初始化接受程序可能会更可靠,例如,当网络配置更改时?谢谢。我没有想到客户端在服务器上调用accept之前重置了连接。我的主要平台是Mac,其次是Windows 10。Mac的手册页列出了accept的一组特定错误,Windows文档也是如此。因此,我认为这将归结为尽最大努力识别暂时错误和致命错误,以决定是否让新连接排队或重新初始化。
_acceptor->async_accept([this](const boost::system::error_code& ec, boost::asio::ip::tcp::socket sock) {
if (ec) {
LogErrorCode(ec);
} else {
HandleNewConnection(s);
StartNextAccept();
}
});