网络检测除了心跳包必须带有超时机制

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 最近在开发erlang服务器端的代码时,使用{active, N}选项,可以检测到网络主动断开。但是客户端拔掉网线或者禁用网络,这个服务器端代码没有办法检测到。另外这个时候,服务器端给客户端发送数据,服务器端能显示发送成功,但实际上,这数据已经无法送达了。所以,除了心跳包外,必须带有超时机制。

查了一下,这个是由于物理层已经断开了,但tcp传输层没有发现导致的。

参考:What happens to TCP connections when I remove the ethernet cable?

Howto detect that a network cable has been unplugged in a TCP connection?

在以TCP为连接方式的服务器中,为什么在服务端设计当中需要考虑心跳?

inet:getstat/2的用处(感觉使用{active, N}选项后,这个没有什么作用,但可以了解一下。)

2. 移动客户端在切换到后台,网络可能会被禁用,这个时候要根据系统平台来开启网络心跳包。

微信Android客户端后台保活经验分享

iOS 和 Android 的后台推送原理各是什么?有什么区别?

IOS 网络编程 + 后台保持连接

 

3.可以查看erlang的邮件列表,可以查看到具体的代码演示:

Problem detecting interrupted TCP Connection

Finding closed socket

4.在分布式环境中,我们也必须添加网络失败的情况检测,尤其是分布式数据库中著名的脑裂问题。这里可以提供一个erlang模拟网络失败的博客:

Simulating net-splits in Erlang

转载于:https://my.oschina.net/u/191928/blog/693576

你可能感兴趣的:(网络,移动开发,python)