在我的申请了Mochiweb,我使用的是长保持HTTP请求。我想检测时,与用户的连接死了,我想通了,如何做到这一点做:

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

这工作时:用户关闭标签/浏览器或刷新页面。然而,当互联网连接突然死亡(比如WiFi信号丢失一下子),或在浏览器崩溃的异常,我不能够检测TCP关闭。

我失去了一些东西,或者是有任何其他方式来实现这一目标?

有帮助吗?

解决方案

有一个 TCP存活协议和它可以与inet:setopts/2下被启用选项{keepalive, Boolean}

我会建议你不要使用它。保持连接超时和最大重试次数,往往是全系统,并且它毕竟是可选的。上协议层使用超时是更好。

在HTTP协议具有状态代码请求超时,你可以发送给客户端,如果它似乎已经死了。

查核在接收的块,可以使用超时等待数据,或使用所述定时器模块,或使用aftererlang:start_timer/3子句。它们都具有不同的性能特征和资源成本。

其他提示

有没有一个默认的“保活”(但可以启用如果支持)协议通过TCP:万一有一个连接故障时,没有数据被交换,这转化为“沉默失败”。你会需要考虑自行例如这种类型的故障实现某种形式连接的探测。

这将如何影响HTTP? HTTP是无状态协议 - 这意味着,每一个要求是独立每个其它的。的“保持活动” HTTP的功能不改变,即“沉默失败”仍然可以发生。

<强>仅当数据被交换在此条件被检测到时(或当TCP保持激活使能)。

我建议发送应用程序级别保持在编码分块HTTP有效消息。让你的客户机/服务器智能足够的了解,保持活动的消息,而忽略他们,如果他们在时间或关闭并再到重新建立连接。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top