Адрес уже используется с акцептором boost asio

Я написал сервер, который прослушивает входящие TCP-соединения и подключающиеся к нему клиенты. Когда я выключаю сервер и перезапускаю его на том же порту, я иногда получаю сообщение об ошибке EADDRINUSE при вызове bind (...) (код ошибки: 98 в Linux). Это происходит, даже если я устанавливаю опцию повторного использования сокета.

Ошибка возникает не все время, но кажется, что это происходит чаще, когда клиенты подключены к серверу и отправляют данные, когда он выключается. Я предполагаю, что проблема в том, что пока сервер выключен, все еще есть незавершенные соединения (связанная тема: https://stackoverflow.com/questions/41602/how-to-forcible-close-a-socket-in- time-wait ).

На стороне сервера я использую boost :: asio :: ip :: tcp :: acceptor. Я инициализирую его опцией «reuse_address» (см. http://beta.boost.org/doc/libs/1_38_0/doc/html/boost_asio/reference/basic_socket_acceptor.html ). Вот фрагмент кода:

using boost::asio::ip::tcp;
acceptor acceptor::acceptor(io_service);
endpoint ep(ip::tcp::v4(), port);
acceptor.open(ep.protocol());
acceptor.set_option(acceptor::reuse_address(true));
acceptor.bind(ep);
acceptor.listen();

Приемник закрывается с помощью:

acceptor.close();

Я также пробовал использовать acceptor.cancel () до этого, но это имело тот же эффект. Когда возникла эта ошибка, я не могу перезапустить сервер на том же порту в течение некоторого времени. Перезагрузка сети помогает, но это не постоянное решение.

Что мне не хватает?

Любая помощь будет принята с благодарностью! :)

10
задан Community 23 May 2017 в 12:25
поделиться