找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3228|回复: 0

C++NPV1 同步多路事件分离

[复制链接]
发表于 2009-4-20 10:36:54 | 显示全部楼层 |阅读模式
各位大侠好
最近在看CNPV1,书上一例子没有看懂,望各位指教,谢谢
源代码如下:
virtual int open(u_short logger_port)
{
Iterative_Logging_Server::open(logger_port);
master_handle_set_.set_bit(acceptor().get_handle());//1.此处将侦听socket加入master_handle_set_;
acceptor().enable(ACE_NONBLOCK);
}

virtual int wait_for_multiple_events()
{
active_handles_=master_handle_set_;//2.初始化了活动描述符集
int width=(int)active_handles_.amx_set()+1;
if(select(width,
             active_handles_.fdset(),//3.此处描述符集中只有一个侦听套接字是我们关注的?
             0,
             0,
             0))//4.当select正确返回时,是不是侦听套接字位置上设置为1
return -1;

active_handles_.sync((ACE_HANDLE)active_handles_.max_set()+1);//5.重置活动描述符集的最大活动连接数和活动连接数

}
下面这个函数,我的疑虑最多,麻烦各位耐心看下,谢谢
virtual int handle_connections()
{
if(active_handles_.is_set(acceptor().get_handle()))//6.此处是不是活动描述符集中仍然只有一个侦听套接字,只是侦听套接字已经是活动的了
{
   while(acceptor().accept(logging_handler.peer())==0)//7.书上将其设置为非阻塞,可以循环接收请求队列中的连接,一次性接收所有连接请求,并生成对应的新的套接字logging_handler.peer()?
    master_handle_set_.set_bit(logging_handler().peer().get_handle());//8.此时新的套接字加入master_handle_set_之中
    active_handles_clr_bit(acceptor().get_handle());//9.剔除侦听套接字位
}
return 0;
}

virtual int handle_data(ACE_SOCK_Stream *)
{
for(ACE_HANDLE handle=acceptor().get_handle()+1;handle<avtive_handles_.max_set()+1;handle++) //10.遍历一切活动描述符
{
   if(active_handles_.is_set(handle))
   {
      logging_handler().peer().set_handle(handle);
      if(logging_handler().log_record()==-1)
      {
                     master_handler_set_.clr_bit(handle);//11。删除master中的活动描述符,最后只剩下侦听套接字
                     logging_handler().close();
       }
    }
}
return 0;
}

上述注释部分是我的问题和对这段代码的理解,望指教,谢谢各位!希望大家能提供一个ACE学习交流群,再次感谢

[ 本帖最后由 eagleace 于 2009-4-20 10:37 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 21:38 , Processed in 0.021001 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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