Я написал сервер, который прослушивает входящие TCP-соединения и подключающихся к нему клиентов.Когда я выключаю сервер и перезапускаю его на том же порту, я иногда получаю сообщение об ошибке EADDRINUSE при вызове bind (...) (код ошибки: 98 в Linux).Это происходит, даже если я устанавливаю опцию повторного использования сокета.
Ошибка не возникает постоянно, но, похоже, это происходит чаще, когда клиенты подключаются к серверу и отправляют данные во время его выключения.вниз.Я предполагаю, что проблема в том, что все еще ожидающие соединения, пока сервер выключен (связанная тема: https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait).
На стороне сервера я использую boost :: asio :: ip :: tcp ::акцептор. Я инициализирую его с помощью опции "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();
Iтакже пытался использовать acceptor.cancel () до этого, но это имело тот же эффект. Когда эта ошибка произошла, я не могу перезапустить сервер на тот же порт в течение некоторого времени. Перезапуск сети помогает, но не является постоянным решением.
Чего мне не хватает?
Любая помощь будет принята с благодарностью! :)