【问题标题】:How to empty socket read/write buffers in C++如何在 C++ 中清空套接字读/写缓冲区
【发布时间】:2013-04-22 19:10:44
【问题描述】:

我正在从事这个分布式计算项目,我必须模拟一些“节点”失败一段时间,即它们将无法读取或写入任何传出的 tcp 连接。一种方法来做到这一点将是读取和丢弃消息,但我在 C/C++ 中寻找任何内置选项,您可以在其中设置套接字以丢弃任何传入消息。

【问题讨论】:

    标签: c++ c sockets network-programming pthreads


    【解决方案1】:

    如果您通过关闭套接字来模拟故障,您会错过很多发生问题的情况。您,可能,想要同时测试封闭的和无响应的端点。主机上的解决方案,例如关闭套接字会模拟主机错误,但网络上的解决方案需要应用程序/操作系统支持解决方案。

    已关闭的套接字会自行清理。当您尝试访问使用关闭的套接字运行的操作系统时,它会返回错误。所有这些都是你应该检查的东西。然而,真正的故障,特别是在网络中而不是在主机中,只会丢弃数据包。这可能会使您的系统等待很长时间,而 tcp 超时。

    模拟网络故障的最佳方法是使用防火墙规则。在防火墙处阻止连接的一端或两端,模拟网络故障。 iptables,我相信其他解决方案允许您丢弃部分数据包或具有某些特征的数据包。

    【讨论】:

    • 虽然防火墙解决方案不是解决这个问题的正确解决方案,但我没有关闭套接字,而是将这些节点变成了僵尸,它一直以失败消息响应。那种照顾它。
    【解决方案2】:

    只需关闭“失败”节点正在使用的所有套接字。

    取决于 OP 节点应用程序的完成方式(问题中未提及).. 模拟故障节点的最简单方法是“杀死”节点应用程序,然后将跳过所有 TCP“关闭”数据包,其他节点将不知道连接已关闭或(作为第一阶段)只是手动关闭节点上的所有通信套接字。这意味着不是完全干净的实验,因为其他节点会知道连接以“正确”的方式关闭,但足以检查系统其余部分在某些节点丢失时的行为。

    【讨论】:

    • 我的意思正是我所说的。取决于 OP 节点应用程序的完成方式(问题中未提及).. 模拟故障节点的最简单方法是“杀死”节点应用程序,然后将跳过所有 TCP“关闭”数据包,其他节点将不知道连接关闭或(作为第一阶段)只需手动关闭节点上的所有通信套接字。这意味着不是完全干净的实验,因为其他节点会知道连接以“正确”的方式关闭,但足以检查系统其余部分在某些节点丢失时的行为。
    • 我做到了,但问题是,如果你明白我的意思,给出一个没有“思考的地方”的直接完整答案可能会导致严重的脑损伤......我想指向正确的方向很有价值不仅仅是一个现成的答案,但不明白为什么应该这样做..
    • 对不起,我的意思是您的原始帖子,在 Middaparka 的编辑之前。我无法编辑它,因为我不明白它的含义。然而,现在已经完全清楚了。
    • 对不起,我不是母语人士,今天有点累,所以在最初的帖子中写了一个非常奇怪的东西...... =)
    • 没问题。也不是母语人士,我无法理解Middaparka 显然非常清楚的内容。因此问题。但现在对我来说非常清楚。谢谢(+1)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多