Pregunta

En mi aplicación mochiweb, estoy usando una solicitud HTTP retenida durante mucho tiempo.Quería detectar cuándo falló 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 actualiza la página.Sin embargo, cuando la conexión a Internet se corta repentinamente (por ejemplo, la señal wifi se pierde repentinamente), o cuando el navegador falla de manera anormal, no puedo detectar un cierre de TCP.

¿Me estoy perdiendo algo o hay alguna otra forma de lograrlo?

¿Fue útil?

Solución

Hay un Protocolo de mantenimiento de TCP y se puede habilitar con inet:setopts/2 bajo la opción {keepalive, Boolean}.

Te sugeriría que no lo uses.El tiempo de espera de mantenimiento de actividad y los reintentos máximos tienden a abarcar todo el sistema y, después de todo, son opcionales.Es mejor utilizar tiempos de espera a nivel de protocolo.

El protocolo HTTP tiene la código de estado Tiempo de espera de solicitud que puedes enviar al cliente si parece muerto.

Revisar la after cláusula en bloques de recepción que puede usar para esperar datos, o usar el módulo de temporizador, o usar erlang:start_timer/3.Todos ellos tienen diferentes características de rendimiento y costos de recursos.

Otros consejos

No es un defecto "mantener viva" (pero puede ser habilitado si es compatible ) de protocolo a través de TCP: en caso de que haya un fallo de conexión cuando se intercambia ningún dato, esto se traduce en un "fracaso silenciosa". Lo que se necesita para tener en cuenta este tipo de falla por sí mismo, por ejemplo, aplicar alguna forma de conexión de sondeo.

¿Cómo afecta esta HTTP? HTTP es un protocolo sin estado - esto significa que cada petición es independiente de todos los demás. El "mantener viva" la funcionalidad de HTTP no cambia es decir, que "el fracaso en silencio" aún puede ocurrir.

Sólo cuando se intercambian datos se puede detectar esta condición (o cuando TCP Keep Alive está habilitado).

Yo sugeriría que envía el nivel de aplicación mensajes de mantener vivo a través de HTTP fragmentada-codificación. Haga que su cliente lo suficientemente inteligente / servidor para entender el mensajes de mantener vivo e ignoran si ellos llegan a tiempo o cerrar y volver a establecer la conexión de nuevo.

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