找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4163|回复: 4

ACE_Dev_Poll_Reactor,handle_output问题

[复制链接]
发表于 2007-12-19 21:00:06 | 显示全部楼层 |阅读模式
各位大侠,我在使用ACE_Dev_Poll_Reactor的时候,同时注册READ_MASK和WRITE_MASK但是发现handle_output()函数被狂调,当客户端向服务器发送请求时,handle_input却没有反映,这是怎么回事呢?部分代码如下:
  1. class Mirror : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>
  2. int Mirror::open(void *) {
  3.     //这里Reactor为epoll模型:
  4.    ACE_Reactor::instance()->register_handler(this, ACE_Event_Handler::READ_MASK);
  5.   //导致handle_output被狂调,而当客户端有输入时,handle_input却没有反映
  6.    ACE_Reactor::instance()->register_handler(this, ACE_Event_Handler::WRITE_MASK);
  7.   
  8.    return 0;
  9. }
复制代码
 楼主| 发表于 2007-12-19 21:00:13 | 显示全部楼层
R u sure socket server is opened properly?
Why do you need output mask for socket server?
Can u comment out WRITE_MASK and try again?
Almost certain you did something wrong.(:D
 楼主| 发表于 2007-12-19 21:00:21 | 显示全部楼层
当服务器往客户端发送数据时,我想使用WRITE_MASK,如果不使用WRITE_MASK难道直接将数据send出去吗,还是用别的方法检测socket是否可写?
 楼主| 发表于 2007-12-19 21:00:29 | 显示全部楼层
You don't need WRITE_MASK to send data.
sned_n/send/write... will give you error if something wrong.
 楼主| 发表于 2007-12-19 21:00:35 | 显示全部楼层
现在我是这么做的,如果buffer中有内容,则注册WRITE_MASK,如果buffer中的数据都被发送了,则将WRITE_MASK注销,但是我发现如果调用:

ACE_Reactor::instance()->remove_handler(peer().get_handle(), ACE_Event_Handler::WRITE_MASK );会把当前的SVC_Handler对象析构掉

如果改成:

ACE_Reactor::instance()->remove_handler(peer().get_handle(), ACE_Event_Handler::WRITE_MASK|ACE_Event_Handler::DONT_CALL);

则不会将当前SVC_handler对象析构。运行正常
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-20 07:17 , Processed in 0.023164 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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