Frage

In meiner Mochiweb -Anwendung verwende ich eine längst gehaltene HTTP -Anfrage. Ich wollte erkennen, wann die Verbindung mit dem Benutzer starb, und ich fand heraus, wie das geht, indem ich:

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

Dies funktioniert, wenn: der Benutzer seinen Tab/seinen Browser schließt oder die Seite aktualisiert. Wenn die Internetverbindung jedoch plötzlich stirbt (z. B. WLAN -Signal hat plötzlich verloren) oder wenn der Browser ungewöhnlich abstürzt, kann ich keinen TCP -Schluss nachweisen.

Vermisse ich etwas oder gibt es eine andere Möglichkeit, dies zu erreichen?

War es hilfreich?

Lösung

Da ist ein TCP Keepalive -Protokoll und es kann mit aktiviert werden mit inet:setopts/2 unter der Option {keepalive, Boolean}.

Ich würde vorschlagen, dass Sie es nicht verwenden. Das Keep-Alive Timeout und die maximalen Retrimen sind tendenziell breit und sind schließlich optional. Die Verwendung von Zeitüberschreitungen auf der Protokollebene ist besser.

Das HTTP -Protokoll hat das Statuscode -Anforderung Zeitlimit was Sie an den Kunden senden können, wenn es tot erscheint.

Probier das aus after Klausel in Empfangsblöcken, mit denen Sie Zeitüberschreitungen auf Daten warten oder das Timer -Modul verwenden oder verwenden oder verwenden können erlang:start_timer/3. Sie alle haben unterschiedliche Leistungsmerkmale und Ressourcenkosten.

Andere Tipps

Es gibt keinen Standard "Keep Heeard" (kann aber sein aktiviert, wenn er unterstützt wird) Protokoll über TCP: Falls es einen Verbindungsfehler gibt, wenn keine Daten ausgetauscht werden, bedeutet dies zu einem "stillen Fehler". Sie müssten diese Art von Fehlern selbst berücksichtigen, z. B. implementieren Sie eine Form der Verbindungsuntersuchung.

Wie wirkt sich dies auf HTTP aus? HTTP ist ein staatenloser Protokoll - dies bedeutet, dass jede Anfrage von jeder anderen unabhängig ist. Die Funktionalität von HTTP "Keep Leave Alive" ändert sich nicht, dass der IE "stiller Versagen" immer noch auftreten kann.

Nur wenn Daten ausgetauscht werden Kann diese Bedingung erkannt werden (oder wenn TCP bleibt, ist aktiviert).

Ich würde empfehlen, die Anwendungsstufe zu senden, um die lebendigen Nachrichten über HTTP-Chunked-Coding zu senden. Lassen Sie Ihren Client/Server intelligent genug, um die Keep Alive-Nachrichten zu verstehen, und ignorieren Sie sie, wenn sie pünktlich eintreffen oder die Verbindung erneut schließen und wiederherstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top