找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 2873|回复: 0

ACE5.6中的一个BUG: 传给ACE_Asynch_Acceptor::accept的参数act...

[复制链接]
发表于 2009-1-8 11:24:39 | 显示全部楼层 |阅读模式
ACE5.6中的一个BUG: 传给ACE_Asynch_Acceptor::accept的参数act只有在处理第一个连接时才有效


ACE_Asynch_Acceptor中启动异步监听的数:
virtual int accept (size_t bytes_to_read = 0, const void *act = 0);

其中第二个参数: act 会在连接到达时,传给ACE_Service_Handler的实例:
    void ACE_Service_Handler::act (const void * _act)

开发人员,实现ACE_Service_Handler时,只要实现act函数,就可以收到收到在启动监听传入act值。
这样可以使新连接的处理实例ACE_Service_Handler与监听启动部分,有效的关联...

在ACE5.6的实现中,通地accept传入的act到第二个连接到达时,就会变为NULL
看一看ACE的代码,就可以发现问题所在:
ace\Asynch_Acceptor.cpp :  342行
...
template <class HANDLER> void
ACE_Asynch_Acceptor<HANDLER>::handle_accept (const ACE_Asynch_Accept::Result &result)
{
  ACE_TRACE ("ACE_Asynch_Acceptor<>::handle_accept");
  // Variable for error tracking
  int error = 0;
  ...
  //处理新收到的连接 代码略..
  ...

  //再次启动监听,等待下一个连接到达,问题就在这里
  if (this->should_reissue_accept () &&
        this->listen_handle_ != ACE_INVALID_HANDLE
#if defined (ACE_WIN32)
        && result.error () != ERROR_OPERATION_ABORTED
#else
        && result.error () != ECANCELED
#endif
        )
     this->accept (this->bytes_to_read_);  // <<< 这句, 在这一次启动时,ACE就没有传入act的值!!!
}
应该将那句改为:
this->accept(this->bytes_to_read_, result.act ()); // 其实这里result的内存已被释放,所以应将这段代码向前移移



转自我的博客:http://hi.baidu.com/hardcorn/blog/item/222890cae5722481c917689c.html
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 22:24 , Processed in 0.015373 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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