bind 发表于 2013-8-23 10:48:20

帮忙看下代码问题

看到一些代码不懂,handle_close 里面的处理,请帮忙看下;

int Client_Handler::handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
ACE_DEBUG((LM_DEBUG, " handle_close..................................... \n"));
if (close_mask == WRITE_MASK)
{
return 0;====================================> 这个为啥返回0呢?还没有 delete this,难道调用了handle_close后,对应的Client_Handler不应该被删除??
}
else
{
ACE_INET_Addr remotePeer;
m_stream.get_remote_addr(remotePeer);
cout << "Disconnected: " << remotePeer.get_host_name() << ":" << remotePeer.get_port_number() << endl;
m_stream.close();
delete this;
return -1; // return value ignored by reactor
}
}

sushe2111 发表于 2013-9-9 15:33:24

(close_mask == WRITE_MASK)这是什么意思呢?

yunh 发表于 2014-2-19 13:54:10

首先说下ACE_Reactor_Mask,用来指定调用register_handler时指定感兴趣的事件,常用的枚举有READ_MASK/WRITE_MASK,分别指定Reactor在socket可读/可写时回调我们提供的ACE_Event_Handler派生类(这里应该是Client_Handler)之handle_input/handle_output方法,在这些回调函数中再调用socket的读/写方法传输数据。在底层,事件检测是通过select系统调用来实现的,select可以检测到指定socket句柄上的特定事件,从而进行事件的分派,但select在Unix上的实现与Windows很不一样,前者是水平触发,即只要可读/可写,就会不停的回调;而后者是边沿触发,即只有当状态从不可读/写变为可读/写时触发一次,之后即使继续可读/写,也不再触发。这是跨平台编程需要考虑的地方,不能依赖于平台的特性,而应写出各种平台都可以通用的代码。
handle_input/output如果返回-1,Reactor会自动调用handle_close来做相应的清理工作,其中close_mask即是指定清理何种事件,如果应用指定了多个标志位,就必需对close_mask进行判断,进行相应的处理,不能一概delete了之,例如上面这段代码,如果传入的参数是WRITE_MASK,表示不再订阅socket可写通知,但此时可能还订阅着读取通知,所以还不能销毁对象,要等到读取通知也取消时,才最终销毁对象。这是我的一种猜测,LZ不妨贴出Client_Handler全部代码供大家一览。
这段代码与《ACE程序员指南》P117的示例代码非常像,有兴趣的可以去看下原文和作者的详细解释。
页: [1]
查看完整版本: 帮忙看下代码问题