如何从客户端找出TCP服务器状态(在冗余服务器的情况下)?

时间:2011-08-23 06:09:31

标签: c++ c sockets networking tcp

我有一个情况。我有一个冗余的TCP服务器设置,它接受输入,然后永远抛出大量的数据包。在阅读它们的同时,我还试图通过在套接字上执行发送来跟上TCP客户端的服务器状态。    但我的服务器冗余共享虚拟IP。因此,如果server1发生故障,server2将启动并使用相同的VIP(在任何时候VIP都已启动并运行)。所以我的发送技术能够找出这种情况。    我的server2等待客户端的输入,但由于发送没有完成我希望它做的工作,我无法再次发送输入。

  int status = ::send ( m_sock, s.c_str(), s.size(), MSG_NOSIGNAL );
  if ( status == -1 )
    {
      return false;
    }
  else
    {
      return true;
    }

有人可以帮助我找出这种故障转移吗?

3 个答案:

答案 0 :(得分:1)

好的,把事情拼凑在一起,我开始在这里拍照了。

  • OP正在使用某种故障转移,其中远程服务器实际上没有跟踪状态

你没有从发送中获得EPIPE的原因是事情就是这样发生的:

  • send数据。 send取消阻止和细分受众群开始旅行
  • 远程服务器接收数据。 “谁 这个家伙?RST!”
  • 您获得了RST,但send已经返回。连接断了,但没有办法通知你(它没有任何带外机制)
  • 另一个send

总之,如果您想测试连接是否仍然存在:

  • send数据
  • 等一下(RTT等)
  • send 再次

如果在第二个EPIPE之后没有得到send,则连接仍然正常。另一个方案:

  • send数据应该被解释为“如果你还活着,那就说些什么”。
  • 等一下
  • 如果超时后您尚未收到确认,则连接已停止

答案 1 :(得分:0)

TCP会话无法通过第二个服务器接管第一个IP地址从一个服务器故障转移到另一个服务器 - TCP会话状态信息也必须从主服务器复制到辅助服务器,这需要特殊的软件。 / p>

答案 2 :(得分:0)

最终发送到已接管的服务器必须失败,因为该服务器将不知道来自客户端IP:端口的连接,因此它将发出一个RST,它返回为send()返回-1并且errno = ECONNRESET。由于异步和缓冲,这几乎肯定不会在故障转移后的第一次发送时发生。

相关问题