在一个关闭的连接上发送



如果客户端通过正常的tcp连接连接到服务器,然后在客户端连接断开时,服务器将获得(假设是活动模式){tcp_closed,Socket}。但是在某些情况下,服务器不知道客户机已经断开连接,例如电源故障或崩溃等(我相信,我可能错了)。在这些情况下,客户机已经离开,但服务器仍然认为它已连接。如果服务器试图在这些情况下向客户端发送消息,它会假设客户端收到消息,还是tcp堆栈会在低级别上对消息进行排序,然后服务器返回某种错误?

我知道这是一个简单的问题,但我一直有麻烦测试它自己,因为我不能让客户端灾难性地失败,因为我需要它(甚至杀死-9不做它)。有人有这方面的经验吗?

答案要看情况。当您尝试发送数据时,内核的TCP窗口将慢慢填满,直到它不能再接收任何数据。然后您的发送将阻塞,因为内部内核缓冲区已满。TCP有一些计时器,会在一段时间后触发。当发生这种情况时,内核将发送请求错误,erlang VM运行时将其转换为{error, Reason},其中Reason是底层系统的posix()错误消息。

如果您想确保数据通过,则必须以另一种方式在流上确认它。或者你可以让数据幂等这样你就可以毫不费力地重新发送它。如果另一个端点,即客户端,是一个像移动电话这样的设备,那么它就特别重要,因为断开连接总是会发生。

为了测试它,可以在lo上使用防火墙规则阻止通信。

最新更新