找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4257|回复: 2

帮忙看下代码问题

[复制链接]
发表于 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  
}  
}  
发表于 2013-9-9 15:33:24 | 显示全部楼层
(close_mask == WRITE_MASK)  这是什么意思呢?
发表于 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的示例代码非常像,有兴趣的可以去看下原文和作者的详细解释。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 16:24 , Processed in 0.015768 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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