3

我有一个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);

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

4

1 回答 1

2

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

您必须在 set_option 之前打开套接字,在此之前尝试一下,async_connect然后set_option

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

在 set_option调用Bad file descriptor上直接在未初始化的套接字上调用错误。

于 2012-10-11T17:46:01.587 回答