使用inet检测HTTP关闭

jef*_*eon 6 erlang http mochiweb inet

在我的mochiweb应用程序中,我使用长期持有的HTTP请求.我想检测与用户的连接何时死亡,我想通过这样做来弄清楚如何做到这一点:

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

这适用于:用户关闭其选项卡/浏览器或刷新页面.然而,当互联网连接突然死亡(说wifi信号突然丢失),或者当浏览器异常崩溃时,我无法检测到tcp关闭.

我错过了什么,或者还有其他方法可以实现这一目标吗?

Chr*_*ian 2

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

我建议你不要使用它。保持活动超时和最大重试次数往往是系统范围内的,而且它毕竟是可选的。在协议级别使用超时效果更好。

HTTP 协议具有状态代码“请求超时”,如果客户端似乎已失效,您可以将其发送到客户端。

查看after接收块中的子句,您可以使用它来超时等待数据,或者使用计时器模块,或者使用erlang:start_timer/3. 它们都有不同的性能特征和资源成本。