2

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

我知道这是一个简单的问题,但我自己测试它时遇到了麻烦,因为我无法让客户像我需要的那样发生灾难性的失败(即使 kill -9 也没有这样做)。有人对这个有经验么?

4

1 回答 1

4

答案取决于。当您尝试发送数据时,内核 TCP 窗口将慢慢填满,直到无法接收更多数据。然后您的发送将阻塞,因为内部内核缓冲区已满。TCP 有一些定时器,它们会在一段时间后触发。发生这种情况时,内核将错误发送请求,Erlangs VM 运行时会将其转换为{error, Reason},其中Reasonposix()来自底层系统的错误消息。

如果您想确保数据通过,您必须以另一种方式在流上确认它。或者您可以使数据具有幂等性,这样您就可以轻松地重新发送它。如果另一个端点(客户端)是一个像手机这样的设备,并且总是会断开连接,这一点尤其重要。

要对其进行测试,您可以使用 lo 上的防火墙规则阻止通信。

于 2011-04-09T09:10:34.090 回答