提升::ASIO set_option错误

boost::asio set_option error

本文关键字:option 错误 set ASIO 提升      更新时间:2023-10-16

我有一个简单的boost::asio::ip::tcp::acceptor它几乎什么都不做 - 它接受无限循环中的连接。然后,我有许多连接器同时运行,尝试连接...

pSocket->async_connect(endpoint, 
        [=](boost::system::error_code error)
        {
            if(!error)
            {
                boost::asio::ip::tcp::no_delay noDelay(true);
                pSocket->set_option(noDelay, error);
                assert(!error);
                std::cout << error.message() << 'n'; // "An invalid argument was supplied"
            }
        });

一切都在无限循环中运行,我正在运行 2 个客户端和 1 个服务器,所有环回连接。一段时间后(数百个成功的连接和断开连接),在连接的插座上设置no_delay选项时,我收到错误An invalid argument was supplied

在什么情况下,在套接字上设置选项会导致此错误?以前有没有人见过这种情况,并且知道它为什么会发生和/或修复它的方法?

更新:如果我将设置set_option更改为类似...

do
{
    pSocket->set_option(noDelay, error);
} while(error);

。它会成功 - 通常在失败后的第二次尝试中。

昨天我逐步调试set_option,问题是set_option使用io_service_impl对象,但它包含错误的套接字指针,这就是它崩溃的原因。但是在套接字创建时没有设置此套接字,所以我认为您不能以这种方式在套接字上设置选项。

您必须在set_option之前打开套接字,请在async_connectset_option之前尝试此操作:

sock->open(boost::asio::ip::tcp::v4());

错误被称为Bad file descriptor,set_option调用时直接指向未初始化的套接字。