|
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
|
|