http - guia - qgis manual
Detectando el cierre de HTTP usando inet (3)
En mi aplicación mochiweb, estoy usando una solicitud HTTP largamente retenida. Quería detectar cuándo murió la conexión con el usuario, y descubrí cómo hacerlo haciendo:
Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
receive
{tcp_closed, Socket} ->
% handle clean up
Data ->
% do something
end.
Esto funciona cuando: el usuario cierra su pestaña / navegador o refresca la página. Sin embargo, cuando la conexión a Internet muere repentinamente (digamos que la señal wifi se pierde de repente), o cuando el navegador falla de manera anormal, no puedo detectar un tcp cercano.
¿Me estoy perdiendo algo, o hay alguna otra forma de lograr esto?
Existe un protocolo TCP keepalive y se puede habilitar con inet:setopts/2
en la opción {keepalive, Boolean}
.
Sugeriría que no lo uses. El tiempo de espera keep-alive y max-retries tiende a ser de todo el sistema, y es opcional después de todo. Usar tiempos de espera en el nivel de protocolo es mejor.
El protocolo HTTP tiene el código de estado Request Timeout que puede enviar al cliente si parece muerto.
Consulte la cláusula after
en los bloques de recepción que puede usar para esperar el tiempo de espera de los datos, o use el módulo del temporizador, o use erlang:start_timer/3
. Todos ellos tienen diferentes características de rendimiento y costos de recursos.
No existe un protocolo predeterminado "keep alive" (pero puede habilitarse si se admite ) a través de TCP: en caso de que haya un error de conexión cuando no se intercambian datos, esto se traduce en un "error silencioso". Debería tener en cuenta este tipo de falla usted mismo, por ejemplo, implementar algún tipo de prueba de conexión.
¿Cómo afecta esto a HTTP? HTTP es un protocolo sin estado; esto significa que cada solicitud es independiente de todas las demás. La funcionalidad "mantener vivo" de HTTP no cambia, es decir, que aún puede haber "falla silenciosa".
Solo cuando se intercambian datos se puede detectar esta condición (o cuando TCP Keep Alive está habilitado).
Sugiero enviar los mensajes de mantener vivo de nivel de aplicación a través de la codificación por fragmentos HTTP. Haga que su cliente / servidor sea lo suficientemente inteligente como para comprender los mensajes de mantener vivo e ignórelos si llegan a tiempo o cierran y restablecen la conexión nuevamente.