hardcorn 发表于 2008-11-13 15:38:32

关于ACE_Proactor的两个问题

1. 调用ACE_Asynch_Connector的方法 connect 连接失败时(就像超时这种不会立即返回失败的情况),ACE没有没提供是什么方法可以通知我,连接已经失败了?

2. 是不是在ACE_Proactor中,要想检测连接是不否断开,只有能过不断read,在 handle_read_stream 中来判断?


先谢谢回贴的朋友。

okibun0129 发表于 2008-11-13 15:57:01

1.我们可以继承validate_connection方法,如果连接创建失败,框架会自动调用我们继承的validate_connection方法,我们自己可以根据结果判断如何处理
2.有点没看懂,不过如果想实时检测连接是否断开,可能需要自己主动探查。

hardcorn 发表于 2008-11-13 17:10:52

多谢, 我试了一下, 在validate_connection 中是可以通过 result.success() 来判断连接操作是否成功。

int CMyConnector::validate_connection (const ACE_Asynch_Connect::Result& result,
             const ACE_INET_Addr &remote,
             const ACE_INET_Addr& local)
   {
         if ( ! result.success() )
         {
             //如果连接失败
             return -1;
         }

         return 0;
   }


第二个问题我是想说,连接已经建好, 但当对端主对closesocket,断开连接时,别一端如何检测到? 在Reactor中,有一个handle_close,面Proactor中好像没有相关方法...

winston 发表于 2008-11-13 19:11:34

第二个问题是经典问题,TCP不提供断开的主动通知,所以一般都是自己做心跳检查,在handle_read_stream 中判定,如果出现错误,就关闭链接。不需要handle_close方法。

hardcorn 发表于 2008-11-14 10:10:32

嗯,了解了。 多谢

断开通知的问题我在用ACE_Reactor时,也是用心跳包去做的, 只是在用Proactor时奇怪没找到handle_close, 呵呵

newzai 发表于 2008-11-29 21:34:09

如果是对端主动关闭,那么会在 handle_read_stream得到通知。
如果是网络中断,那么不会了,需要自己检测或者设置 TCP_KEEPALIVE的支持

winston 发表于 2008-11-29 21:43:19

TCP_KEEPALIVE不是好选择,参见UNIX网络编程中的解释。
页: [1]
查看完整版本: 关于ACE_Proactor的两个问题