Erlang:发送关闭的连接

时间:2011-04-07 17:44:28

标签: erlang send disconnect gen-tcp

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

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

1 个答案:

答案 0 :(得分:3)

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

如果你想确保数据通过,你必须在流上以另一种方式确认它。或者您可以使数据具有幂等性,以便您可以毫无困难地重新发送它。特别重要的是,如果另一个端点(客户端)是像移动电话那样一直发生断线的设备。

要测试它,您可以阻止与lo上的防火墙规则的通信。