尽管使用了reset_address选项,Boost ASIO Linux仍然使用了地址,为什么?

时间:2019-05-06 16:51:20

标签: c++ linux boost boost-asio asio

MyClass()
: m_IoService()
 , m_Acceptor(m_IoService)
{
    char address[] = "0.0.0.0";
    char port[] = "6400";
    boost::asio::ip::tcp::resolver resolver(m_IoService);
    boost::system::error_code resultCode;
    boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve({ address, port }, resultCode);
    if (resultCode)
    {
    }

    m_Acceptor.open(endpoint.protocol(), resultcode);
    if(resultCode)
    {
    }

    m_Acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true), resultCode);
    if (resultCode)
    {
    }

    m_Acceptor.bind(endpoint, resultCode);
    if (resultCode)
    {
        // Error here
    }
}

Address already in use的Linux上,我从acceptor.bind中遇到了一个错误,但显然设置了reuse_address(true)。在Windows上不会发生这种情况。我是否缺少其他选择?

请注意,这并非始终发生,但有时会发生。我认为这是在程序的最后一个进程/运行关闭时发生的,端口进入WAIT状态,然后如果该程序在该时间段内再次运行,它将无法按我的意愿重复使用该端口。但是,如果经过了足够的时间,或者端口已安全关闭,这不是问题。 Windows永远不会出现此问题。

此SO似乎表明平台之间存在差异,但并未说明如何使Linux重用端口:BOOST ASIO: Why don't I get "bind: Address already in use" in Windows (but do get it in Linux)?

0 个答案:

没有答案