【发布时间】:2015-07-20 12:47:41
【问题描述】:
我使用一个 pthread 每 2 秒轮询一次网络。 为此,我从 pthread 的 run() 方法调用一个客户端接口。 但是当服务器和客户端之间的网络断开时会发生什么,这个方法应该抛出异常,但现在没有发生。所以我打算强制返回这个方法并退出线程。
为了实现这一点,我尝试通过发出信号来强制退出线程。 但我仍然面临的问题是,从线程本身退出后,客户端接口很晚才抛出异常。这导致我的实现行为不一致。
我的代码是这样的
//server side code
//This is Linux code
void ServerImp::run()
{
try {
while(1)
{
Client->PingNetwork()
}
}
catch(...)
{
//Handle exception
}
}
//PingNetwork implementation
//This is Windows code
void NetworkImpl::PingNetwork() throw exception
{
try{
while(IsValidClient())//This will return as soon as client disconnected from server
{
sleep(2);
}
}
catch(...)
{
//Handle exception
}
}
提出这个问题的基本思路是,对我来说,我的底层交互 TAO 2.0a 没有立即检测当前会话的网络故障,但在客户端它及时检测到它并启动另一个新会话进行连接。但一段时间后新旧会话都出现了 CORBA::COMM_FAILURE 异常,因此导致服务器和客户端的行为不稳定。 这是TAO的限制吗?或者我必须做点什么才能让它发挥作用。 如果有什么办法可以解决这里问题,请帮助我。
谢谢
【问题讨论】:
-
不知道你的代码做什么或你的问题是什么。
-
尝试创建 mcve 是有目的的。此外,我的 mcve 努力已经确定了我的错误。试一试。 (Q 数仍为 0,叹气。)
-
也许您应该寻找解决问题原因的方法,这听起来像是超时问题。可能有一个 setsocketopt 来减少超时,然后您可以正确处理异常。
-
嗨,理查德,谢谢,但我在这里面临的问题是网络已断开但 PingNetwork() 没有返回,如果我也使用超时,那么以后的新连接也会受到此影响。所以我希望在网络消失时让它正常返回。
-
您应该设置 CORBA 消息传递超时策略以明确设置您希望等待回复的时间。现在你可能会得到一个 TCPIP 等待时间,30 秒或更长时间。