Question

Dans ma demande de mochiweb, je me sers d'une requête HTTP de longue date. Je voulais détecter lorsque la connexion avec l'utilisateur est mort, et je compris comment le faire en faisant:

Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
receive
     {tcp_closed, Socket} ->
             % handle clean up
     Data ->
             % do something 
end.

Cela fonctionne lorsque: l'utilisateur ferme son onglet / navigateur ou actualise la page. Cependant, lorsque la connexion Internet meurt soudainement (disons signal wifi perdu tout d'un coup), ou lorsque le navigateur se bloque de façon anormale, je ne suis pas en mesure de détecter une proximité tcp.

me manque quelque chose que je, ou est-il un autre moyen d'y parvenir?

Était-ce utile?

La solution

Il y a un protocole TCP keepalive et il peut être activé avec inet:setopts/2 sous la Option {keepalive, Boolean}.

Je suggère que vous ne l'utilisez pas. Le délai d'attente de keep-alive et max-retries a tendance à être l'ensemble du système, et il est en option après tout. En utilisant les délais d'attente au niveau du protocole est mieux.

Le protocole HTTP a code d'état Délai d'attente demande que vous pouvez envoyer au client s'il semble mort.

Consultez la clause after en recevoir des blocs que vous pouvez utiliser pour délai d'attente d'attente pour les données, ou utilisez le module de minuterie, ou utilisez erlang:start_timer/3. Ils ont tous des caractéristiques de performance et les coûts des ressources.

Autres conseils

Il n'y a pas défaut « maintenir en vie » (mais peut être activé si pris en charge ) protocole sur TCP: en cas d'un défaut de connexion en l'absence de données sont échangées, cela se traduit par un « échec silencieux ». Vous devez tenir compte de ce type de défaillance par vous-même par exemple mettre en œuvre une certaine forme de sondage connexion.

Comment cela affecte-t HTTP? HTTP est un protocole sans état - cela signifie que chaque demande est indépendante de tous les autres. Le « garder en vie » fonctionnalité HTTP ne change pas dire « l'échec silencieux » peut encore se produire.

uniquement lorsque les données sont échangées cette condition peut être détectée (ou lorsque TCP Keep Alive est activé).

Je suggère d'envoyer le niveau de l'application messages de maintien sur HTTP codage chunked. Demandez à votre client / serveur assez intelligent pour comprendre les messages garder en vie et de les ignorer si elles arrivent à l'heure ou à proximité et rétablir la connexion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top