【发布时间】:2013-04-22 19:10:44
【问题描述】:
我正在从事这个分布式计算项目,我必须模拟一些“节点”失败一段时间,即它们将无法读取或写入任何传出的 tcp 连接。一种方法来做到这一点将是读取和丢弃消息,但我在 C/C++ 中寻找任何内置选项,您可以在其中设置套接字以丢弃任何传入消息。
【问题讨论】:
标签: c++ c sockets network-programming pthreads
我正在从事这个分布式计算项目,我必须模拟一些“节点”失败一段时间,即它们将无法读取或写入任何传出的 tcp 连接。一种方法来做到这一点将是读取和丢弃消息,但我在 C/C++ 中寻找任何内置选项,您可以在其中设置套接字以丢弃任何传入消息。
【问题讨论】:
标签: c++ c sockets network-programming pthreads
如果您通过关闭套接字来模拟故障,您会错过很多发生问题的情况。您,可能,想要同时测试封闭的和无响应的端点。主机上的解决方案,例如关闭套接字会模拟主机错误,但网络上的解决方案需要应用程序/操作系统支持解决方案。
已关闭的套接字会自行清理。当您尝试访问使用关闭的套接字运行的操作系统时,它会返回错误。所有这些都是你应该检查的东西。然而,真正的故障,特别是在网络中而不是在主机中,只会丢弃数据包。这可能会使您的系统等待很长时间,而 tcp 超时。
模拟网络故障的最佳方法是使用防火墙规则。在防火墙处阻止连接的一端或两端,模拟网络故障。 iptables,我相信其他解决方案允许您丢弃部分数据包或具有某些特征的数据包。
【讨论】:
只需关闭“失败”节点正在使用的所有套接字。
取决于 OP 节点应用程序的完成方式(问题中未提及).. 模拟故障节点的最简单方法是“杀死”节点应用程序,然后将跳过所有 TCP“关闭”数据包,其他节点将不知道连接已关闭或(作为第一阶段)只是手动关闭节点上的所有通信套接字。这意味着不是完全干净的实验,因为其他节点会知道连接以“正确”的方式关闭,但足以检查系统其余部分在某些节点丢失时的行为。
【讨论】: