|
各位大侠好
最近在看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 编辑 ] |
|