找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3911|回复: 6

关于ACE_Proactor的两个问题

[复制链接]
发表于 2008-11-13 15:38:32 | 显示全部楼层 |阅读模式
1. 调用ACE_Asynch_Connector的方法 connect 连接失败时(就像超时这种不会立即返回失败的情况),ACE没有没提供是什么方法可以通知我,连接已经失败了?

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


先谢谢回贴的朋友。
发表于 2008-11-13 15:57:01 | 显示全部楼层
1.我们可以继承validate_connection方法,如果连接创建失败,框架会自动调用我们继承的validate_connection方法,我们自己可以根据结果判断如何处理
2.有点没看懂,不过如果想实时检测连接是否断开,可能需要自己主动探查。
 楼主| 发表于 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中好像没有相关方法...
发表于 2008-11-13 19:11:34 | 显示全部楼层
第二个问题是经典问题,TCP不提供断开的主动通知,所以一般都是自己做心跳检查,在handle_read_stream 中判定,如果出现错误,就关闭链接。不需要handle_close方法。
 楼主| 发表于 2008-11-14 10:10:32 | 显示全部楼层
嗯,了解了。 多谢

断开通知的问题我在用ACE_Reactor时,也是用心跳包去做的, 只是在用Proactor时奇怪没找到handle_close, 呵呵
发表于 2008-11-29 21:34:09 | 显示全部楼层
如果是对端主动关闭,那么会在 handle_read_stream得到通知。
如果是网络中断,那么不会了,需要自己检测或者设置 TCP_KEEPALIVE的支持
发表于 2008-11-29 21:43:19 | 显示全部楼层
TCP_KEEPALIVE不是好选择,参见UNIX网络编程中的解释。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 08:05 , Processed in 0.015893 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表