Я написал сервер, который прослушивает входящие 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 () до этого, но он имел тот же эффект. Когда возникла эта ошибка, я не могу перезапустить сервер на том же порту в течение некоторого времени. Перезагрузка сети помогает, но не является постоянным решением.
Что мне не хватает?
Любая помощь будет принята с благодарностью! :)
netstat -ap, когда это произойдет. - person Sam Miller   schedule 16.11.2010