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)?