Sockets accept套接字是否会出现暂时性故障';值得一试吗?

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,但是那些位于
套接字
标签上的问题可能会对有关
接受
调用的瞬时故障有所了解

在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。

    网络层是否存在值得重试的暂时性问题?对

    但是,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();
        }
    });