我有一个情况。我有一个冗余的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;
}
有人可以帮助我找出这种故障转移吗?
答案 0 :(得分:1)
好的,把事情拼凑在一起,我开始在这里拍照了。
你没有从发送中获得EPIPE的原因是事情就是这样发生的:
send
数据。 send
取消阻止和细分受众群开始旅行send
已经返回。连接断了,但没有办法通知你(它没有任何带外机制)send
总之,如果您想测试连接是否仍然存在:
send
数据send
再次 如果在第二个EPIPE
之后没有得到send
,则连接仍然正常。另一个方案:
send
数据应该被解释为“如果你还活着,那就说些什么”。答案 1 :(得分:0)
TCP会话无法通过第二个服务器接管第一个IP地址从一个服务器故障转移到另一个服务器 - TCP会话状态信息也必须从主服务器复制到辅助服务器,这需要特殊的软件。 / p>
答案 2 :(得分:0)
最终发送到已接管的服务器必须失败,因为该服务器将不知道来自客户端IP:端口的连接,因此它将发出一个RST,它返回为send()返回-1并且errno = ECONNRESET。由于异步和缓冲,这几乎肯定不会在故障转移后的第一次发送时发生。