在我的mochiweb应用程序中,我使用了一个长时间持有的HTTP请求。我想要检测与用户的连接何时终止,并通过执行以下操作来了解如何做到这一点:
Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
receive
{tcp_closed, Socket} ->
% handle clean up
Data ->
% do something
end.当:用户关闭他的标签/浏览器或刷新页面时,这是有效的。但是,当互联网连接突然中断(比如wifi信号突然丢失),或者当浏览器异常崩溃时,我无法检测到tcp关闭。
我是不是遗漏了什么,或者有没有其他方法来实现这一点?
发布于 2009-12-30 22:51:28
有一个TCP keepalive protocol,可以在选项{keepalive, Boolean}下使用inet:setopts/2启用它。
我建议你不要使用它。保持连接超时和最大重试次数往往是系统范围的,而且毕竟是可选的。在协议级使用超时更好。
HTTP协议有一个status code Request Timeout,如果它看起来死了,你可以把它发送给客户端。
查看接收块中的after子句,您可以使用它来超时等待数据,或者使用timer模块,或者使用erlang:start_timer/3。它们都具有不同的性能特征和资源成本。
发布于 2009-12-30 21:07:18
在TCP上没有默认的"keep alive“(但可以是enabled if supported)协议:在没有数据交换时出现连接故障的情况下,这会转换为”静默故障“。你需要自己解释这种类型的失败,例如实现某种形式的连接探测。
这对HTTP有什么影响?HTTP是一种无状态协议-这意味着每个请求都是相互独立的。HTTP的“保持活动”功能不会改变这一点,即“静默失败”仍然可能发生。
仅当交换数据时才能检测到此情况(或启用 Keep Alive时)。
发布于 2010-11-04 11:57:24
我建议通过HTTP分块编码发送应用程序级别的keep alive消息。让您的客户端/服务器足够智能,能够理解keep alive消息,并在它们准时到达或关闭并重新建立连接时忽略它们。
https://stackoverflow.com/questions/1979928
复制相似问题