Escribí un servidor que está escuchando conexiones TCP entrantes y clientes que se conectan a ella. Cuando apago el servidor y lo reinicio en el mismo puerto, a veces aparece el mensaje de error EADDRINUSE al llamar a bind (...) (código de error: 98 en Linux). Esto sucede a pesar de que estoy configurando la opción para reutilizar el socket.Dirección ya en uso con el aceptador boost asio
El error no ocurre todo el tiempo, pero parece que ocurre con mayor frecuencia cuando los clientes están conectados al servidor y envían datos mientras se apaga. Supongo que el problema es que todavía hay conexiones pendientes mientras el servidor está cerrado (tema relacionado: https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait).
En el lado del servidor, estoy usando boost :: asio :: ip :: tcp :: acceptor. Inicializo con la opción "reuse_address" (vea http://beta.boost.org/doc/libs/1_38_0/doc/html/boost_asio/reference/basic_socket_acceptor.html). Aquí está el fragmento de código:
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();
El aceptor se cerró con:
acceptor.close();
También he intentado usar acceptor.cancel() antes de eso, pero tenía el mismo efecto. Cuando se produjo este error, no puedo reiniciar el servidor en el mismo puerto durante bastante tiempo. Reiniciar la red ayuda, pero no es una solución permanente.
¿Qué me estoy perdiendo?
¡Cualquier ayuda sería muy apreciada! :)
¿su servidor es fork procesos secundarios? –
también, ¿está seguro de que el socket está en el estado TIME_WAIT? Es posible que desee obtener el resultado 'netstat -ap' cuando esto suceda. –
Sam, muchas gracias por su aporte! Me ayudó a encontrar la solución a mi problema. Resultó que configuré la opción de dirección de reutilización para el aceptador, pero no para todas las otras conexiones. ¡De nuevo, muchísimas gracias por vuestra ayuda! – Alexander