找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3905|回复: 2

ACE_Asynch_Connector的使用问题

[复制链接]
发表于 2008-4-26 14:40:08 | 显示全部楼层 |阅读模式
我在使用ACE_Asynch_Connector<class HANDLER>框架的时候遇到一个问题:
我从ACE_Asynch_Connector的派生出我们使用的类,作为单件使用,然后调用connect方法,
然后框架会回调make_handler,创建socket句柄,在回调addresses传入地址,最后回调validate_connection检查连接是否建立.
这时候可以可以产生一个以HANDLER为处理器的tcp连接,这时候如果因为某种需要,我主动关闭了socket,
比如:
   ACE_OS::shutdown(this->handle(),SD_SEND);
   ACE_OS::closesocket(this->handle());
   this->handle(ACE_INVALID_HANDLE);
下次重新调用单件的connect方法,建立新的连接的时候,就无法产生TCP连接了.

[ 本帖最后由 okibun0129 于 2008-4-26 16:16 编辑 ]
发表于 2008-4-26 14:47:36 | 显示全部楼层
要看是什么错误,才好分析出来。
 楼主| 发表于 2008-4-26 16:42:48 | 显示全部楼层
分享我的调试经验,这是由于调用次序不当导致的,现已经解决。
由于ACE_Asynch_Connector<class HANDLER>框架并没有聚合HANDLER,也没有必要使用聚合,因此我使用成员变量去保存HANDLER。
因此后面创建的HANDLER会覆盖前一次创建的HANDLER,
由于HANDLER会在Proactor中注册自己,因此无须考虑资源泄露,Proactor会帮助我们释放前一次的HANDLER,
我的问题是由于,我主动调用关闭Socket的时机不当导致的,
我本想在Makehandler内,先关闭Socket,然后在New HANDLER,以达到创建新的TCP链接的时候,自动关闭旧的TCP链接
但是由于是多线程调用,实际调用次序是,我先创建了新的HANDLER,然后才执行到Handler内部的关闭操作,关闭Secket。
这样新创建的HANDLER直接就被我关闭了。所以尽管我发现HANDLER的Open函数确实被调用了,但是最终却无法产生TCP连接.

[ 本帖最后由 okibun0129 于 2008-4-26 17:08 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 13:17 , Processed in 0.023160 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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