Boost ASIO Linux получает адрес, который уже используется, несмотря на параметр reuse_address, почему? - PullRequest
1 голос
/ 06 мая 2019
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
    }
}

У меня возникла ошибка из acceptor.bind в Linux для Address already in use, но у меня явно установлен reuse_address(true). Это не происходит в Windows. Я пропускаю другой вариант?

Обратите внимание, что это происходит не всегда, а иногда. Я предполагаю, что это происходит, когда последний процесс / запуск программы завершается, порт переходит в состояние WAIT, а затем, если эта программа снова запускается в этом таймспаме, она не может повторно использовать порт, как мне бы этого хотелось. Но если проходит достаточно времени или порт надежно закрыт, это не проблема. Однако в Windows эта проблема никогда не возникает.

Эта SO, похоже, указывает на разницу между платформами, но она не объясняет, как заставить Linux повторно использовать порт: BOOST ASIO: Почему я не получаю «bind: Address уже используется» в Windows (но получить его в Linux)?

...