首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用inet检测HTTP关闭

问使用inet检测HTTP关闭
EN

Stack Overflow用户
提问于 2009-12-30 20:22:47
回答 3查看 732关注 0票数 6

在我的mochiweb应用程序中,我使用了一个长时间持有的HTTP请求。我想要检测与用户的连接何时终止,并通过执行以下操作来了解如何做到这一点:

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

当:用户关闭他的标签/浏览器或刷新页面时,这是有效的。但是,当互联网连接突然中断(比如wifi信号突然丢失),或者当浏览器异常崩溃时,我无法检测到tcp关闭。

我是不是遗漏了什么,或者有没有其他方法来实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。它们都具有不同的性能特征和资源成本。

票数 2
EN

Stack Overflow用户

发布于 2009-12-30 21:07:18

在TCP上没有默认的"keep alive“(但可以是enabled if supported)协议:在没有数据交换时出现连接故障的情况下,这会转换为”静默故障“。你需要自己解释这种类型的失败,例如实现某种形式的连接探测。

这对HTTP有什么影响?HTTP是一种无状态协议-这意味着每个请求都是相互独立的。HTTP的“保持活动”功能不会改变这一点,即“静默失败”仍然可能发生。

仅当交换数据时才能检测到此情况(或启用 Keep Alive时)。

票数 1
EN

Stack Overflow用户

发布于 2010-11-04 11:57:24

我建议通过HTTP分块编码发送应用程序级别的keep alive消息。让您的客户端/服务器足够智能,能够理解keep alive消息,并在它们准时到达或关闭并重新建立连接时忽略它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1979928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档