Я написал сервер, который прослушивает подключение TCP-соединений и клиентов, подключающихся к нему. Когда я закрываю сервер и перезапускаю его на том же порту, иногда я получаю сообщение об ошибке EADDRINUSE при вызове bind (...) (код ошибки: 98 в Linux). Это происходит, хотя я устанавливаю возможность повторного использования сокета.
Ошибка не происходит все время, но кажется, что это происходит чаще, когда клиенты подключаются к серверу и отправляют данные во время их закрытия. Я думаю, проблема в том, что все еще ожидающие подключения, пока сервер закрыт (связанная тема: https://stackoverflow.com/info/41602/how-to-forcibly-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() до этого, но имел тот же эффект. Когда эта ошибка возникла, я не могу перезапустить сервер на том же порту в течение некоторого времени. Перезапуск сети помогает, но не является постоянным решением.
Что мне не хватает?
Любая помощь будет принята с благодарностью!:)