Pregunta

¿Cuál es la forma más fácil de verificar si se cerró una toma en el lado remoto de la conexión? socket :: is_open () devuelve true incluso si está cerrado en el lado remoto (estoy usando boost :: asio :: ip :: tcp :: socket ) .

Podría intentar leer el flujo y ver si tiene éxito, pero tendría que cambiar la lógica de mi programa para que funcione de esta manera (no quiero que se extraigan datos del flujo en el punto del cheque).

¿Fue útil?

Solución

Si la conexión ha sido cerrada limpiamente por el par, debe obtener un EOF mientras lee. De lo contrario, generalmente hago ping para averiguar si la conexión está realmente activa.

Otros consejos

Simplemente compruebe el error boost :: asio :: error :: eof en su controlador async_receive . Significa que la conexión ha sido cerrada. Esa es la única forma correcta de hacer esto.

¿Hay disponible una función boost peek? La mayoría de las implementaciones de sockets tienen una forma de leer datos sin eliminarlos de la cola, por lo que puede volver a leerlos más tarde. Esto parece satisfacer sus necesidades.

Después de mirar rápidamente los documentos de asio, no pude encontrar exactamente lo que esperaba, pero eso no significa que no esté allí.

Sugeriría this para empezar.

Creo que, en general, una vez que abras un socket, deberías comenzar a leerlo inmediatamente y nunca dejar de hacerlo. De esta manera, puede hacer que su servidor o cliente sea compatible con los protocolos síncronos y asíncronos. En el momento en que el cliente cierre la conexión, el momento en que la lectura le dirá esto.

El uso de error_code es capaz de verificar si el cliente está conectado o no. Si la conexión es exitosa, error_code error.value () devolverá 0, de lo contrario devolverá otro valor. También puede consultar el mensaje () desde el código de error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top