Mi código usa boost :: asio y io_service en un solo subproceso para realizar varias operaciones de socket. Todas las operaciones son asincrónicas y cada controlador depende de boost::system::error_code
(particularmente boost::asio::error::operation_aborted
) para determinar el resultado de la operación.boost :: asio async handlers invocados sin error después de la cancelación
Ha funcionado perfectamente bien hasta que cambié la lógica para hacer varias conexiones simultáneas y escogí la más rápida. Es decir, cuando se activa el primer controlador async_read_some
, cancelo otros sockets (apagado, cierre - todo) y procedo con el actual. En el 95% de los casos, los manejadores de lectura de otros sockets se invocan con el error operation_aborted. Sin embargo, a veces, estos manejadores de lectura se invocan sin errores, diciéndome que han recibido con éxito N bytes.
Pero la documentación para el zócalo :: cancel() states:
Esta función hace que asíncrono excepcionales conectar, enviar y recibir operaciones para terminar de inmediato, y se pasarán los manejadores para operaciones canceladas el
boost::asio::error::operation_aborted
error.
Entonces, las preguntas: ¿Realmente puedo confiar en el error operation_aborted
en el código de producción? Si puedo, ¿es un error en Asio del impulso 1.46.1? Si no puedo, ¿hay alguna documentación oficial con respecto a esto?
Parece que en su caso los controladores múltiples han "tenido éxito" antes de invocar la cancelación. Puede confiar en que 'operation_aborted' se pase a los controladores que aún no se hayan ejecutado (y que están esperando ser llamados). – Chad