sockets - 失去连接后尽快断开流式 HTTP 连接

标签 sockets tcp erlang ip

因此,我们想要实现的是维持从移动设备到我们的 Erlang HTTP 服务器的大量并发连接。当然,移动设备的连接可能会出现相当间歇性的情况,因此我们希望尽快删除死连接,以避免产生开销。

现在,我不确定我们应该在什么级别检测死连接。 TCP 有保活数据包,需要 ACK。因此,理想情况下,我们每 15 秒发送一个保活数据包,如果我们在接下来的 15 秒内没有收到 ACK,那么我们就会断开连接。然而,我不知道这在 Erlang 中是否可能。另外,我认为某些 NAT、Wi-Fi 路由器和移动网络可能会在一定时间内确认保持事件,如果我错了,请纠正我。是这样吗?如果是这样,是否有任何 TCP 级别的替代方法来执行“心跳”?

我们还尝试了应用程序级心跳 - 沿 HTTP 流发送\n。然而,即使设置了所有适用的 Erlang 选项(包括 send_timeout),在某些情况下(例如,移动设备距离 Wi-Fi 路由器太远),我们在大约 5 分钟内不会收到任何错误。

我们如何才能最好地实现流式 HTTP 连接,使服务器在失去联系后尽快断开连接?任何帮助将不胜感激!

最佳答案

您可以为 HTTP 连接添加特定的看门狗。看门狗将具有可配置的超时,该超时将在连接上的每次操作(读或写)后重置。如果在指定的超时时间内没有对套接字进行任何操作 - 连接将关闭。

这种方法将消除过时连接的问题(连接完全健康但没有任何 I/O 事件)。如果客户端超出覆盖范围,连接将仅持续指定的超时时间。使用看门狗方法时也不需要保持事件机制。

唯一的缺点是服务器不会立即检测到断开的连接,而是等待连接看门狗中指定的超时。

关于sockets - 失去连接后尽快断开流式 HTTP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418643/

相关文章:

Java套接字: open connections from server to client

sockets - 通过多个套接字传输文件是否比仅使用一个套接字更快?

erlang - 我如何告诉主管启动特定 gen_server 的 1000 个实例?

c++ - QT 甚至在 waitForConnected 运行时进行处理

security - 如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据?

linux - 为什么一个HTTP请求请求是在第一个ack包之后发送的?

c++ - 将 double 转换并连接到字节数组

ruby - 如何在Elixir中使用AES CBC 128进行加密和解密

binary - 全二进制输出

c# - 保持套接字打开一次并多次发送/接收消息