ACE Tutorial [翻译] 02-page02 :: 风之谷

来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=464209 存档链接: https://web.archive.org/web/20041109133234id_/http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=464209


风之谷 有关ACE/TAO,还有CORBA的学习资料 <<<ACE Tutorial [翻译] 02-page01 | 首页 | ACE Tutorial [翻译] 02-page03>>> ACE Tutorial [翻译] 02-page02 时间:2004-10-28 和教程 1 一样,这也是一个很小的程序。在这里我将添加一下新的概念,做为补偿,我将吧 acceptor 进行大量简化。 Kirthika's 给出的概述 通过 ACE 所提供的现货组件以及类,使得我们的服务例子变得更加简单。 在这里, Logging_Acceptor 继承于 ACE_Acceptor ,并且和 Logging_Handler 以及 ACE_SOCK_ACCEPTOR 相关联。这样通过向 reactor 实例进行注册,获得客户端得连接请求并进行处理。 我们将通过 ACE_SigAction 以及 ACE_SignalHandler, 来实现信号( signal )处理抓取 CTRL_C ( 产生 SIGINT 信号 ). 通过这个信号来终止 reactor 处理事件。 接下来,让 reactor 接收到 ^C 时,结束死循环的执行,并完成 reactor 和 acceptor 的销毁工作。 Logging_Handler 这次是派生于 ACE_Svc_Handler 而不是 Event_Handler ,这是因为 Svc_Handler 包含了 SOCK_Stream 并且提供了所有 reactor 需要的方法。 Svc_Handler 具备响应事件,并通过底层的数据流和远端的任务进行交互。 在 Reactor 中的定时器可根据需要运行需要定时执行的任务,其中事件间隔是通过 ACE_TimeValue 来实现。 同时对象的析构方法进行优化。( Also, optimisations have been made in the form of a separate function for destroying the objects used.) 在这里我们展示了如何用 ACE 的组件构建一个简单的服务器程序。 下面让我们看一下主程序 // page02.html,v 1.10 2000/03/19 20:09:20 jcej Exp /* As before, we need a few ACE objects as well as our Logging_Handler declaration. / / 和以前Logging_Handler一样,我们在这里需要引入一下ACE所提供的对象*/ #include " ace/Acceptor.h " #include " ace/SOCK_Acceptor.h " #include " ace/Reactor.h " #include " handler.h " /* We'll still use the global reactor pointer. There's a snappy way around this that shows up in later server tutorials. / / 我们还是使用一个全局的reactor指针。在后面的教程中我们将会展示一个 更加简单的方式 / ACE_Reactor g_reactor; / This was hinted at in Tutorial 1. Remember the hand-coded acceptor that we created there? This template does all of that and more and better. If you find yourself creating code that doesn't feel like a part of your application, there's a good chance that ACE has a template or framework component to do it for you. / / 在教程1中,我们曾提到过这部分内容。 还记得我们为acceptor 所写的代码吗? 通过下面的模板,可以多快好省地实现我们上面提到功能。 如果你决定不写与应用层不相关的代码,那么使用 ACE所提供的模板将是最佳选择/ typedef ACE_Acceptor <Logging_Handler, ACE_SOCK_ACCEPTOR> Logging_Acceptor; /* One of the new things will be a signal handler so that we can exit the application somewhat cleanly. The 'finished' flag is used instead of the previous infninite loop and the 'handler' will set that flag in respose to SIGINT (CTRL-C). The invocation of ACE_Reactor::notify () will cause the handle_events() to return so that we can see the new value of 'finished'. / /这里我们为了能够让应用能够比较清晰地退出,将接触一个新的概念信号处理。 通过 finished 标记来取代死循环,并通过handler方法来响应SIGINT(CTRL_C) 并改变 finished标记的值。 通过调用 ACE_Reactor::notify ()方法使得handle_events()方法返回,并使得 'finished'的值生效/ static sig_atomic_t finished = 0; extern " C " void handler (int) { finished = 1; g_reactor->notify(); } static const u_short PORT = ACE_DEFAULT_SERVER_PORT; int main (int, char ) { // Create the reactor we'll register our event handler derivatives with. // 创建reactor,这样就可以把我的事件句柄向其注册了 ACE_NEW_RETURN (g_reactor, ACE_Reactor, 1); // Create the acceptor that will listen for client connetions // 创建acceptor,来监听客户的连接请求 Logging_Acceptor peer_acceptor; / Notice how similar this is to the open() call in Tutorial 1. I read ahead when I created that one so that it would come out this way... / / 注意这里的open方法是和教程1中提到的内容一致。/ if (peer_acceptor.open (ACE_INET_Addr (PORT), g_reactor) == -1) ACE_ERROR_RETURN ((LM_ERROR, " %p\n ", " open "), -1); / Here's the easiest way to respond to signals in your application. Simply construct an ACE_Sig_Action object with a " C " function and the signal you want to capture. As you might expect, there is also a way to register signal handlers with a reactor but we take the easy-out here. / /这里给出了一让应用响应信号的简单实现方式。 创建 ACE_Sig_Action对象,并传入一个 ” C ” 语言的方法指针, 以及你所要捕获的信号。这样正如你所期望的,通过这个对象就实现了 向 reactor注册信号处理句柄的工作。/ ACE_Sig_Action sa ((ACE_SignalHandler) handler, SIGINT); ACE_DEBUG ((LM_DEBUG, " (%P|%t) starting up server logging daemon\n ")); // Perform logging service until the signal handler receives SIGINT. // 在接收到SIGINT之前一直提供日志服务 while (!finished) g_reactor->handle_events (); // Close the acceptor so that no more clients will be taken in. // 关闭acceptor,不接收客户端的请求 peer_acceptor.close(); // Free up the memory allocated for the reactor. // 释放reactor所占有的空间 delete g_reactor; ACE_DEBUG ((LM_DEBUG, " (%P|%t) shutting down server logging daemon\n ")); return 0; } #if defined ( ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION ) template class ACE_Acceptor <Logging_Handler, ACE_SOCK_ACCEPTOR>; template class ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>; #elif defined ( ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA ) #pragma instantiate ACE_Acceptor <Logging_Handler, ACE_SOCK_ACCEPTOR> #pragma instantiate ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> #endif / ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ jnn 发表于 2004-10-28 09:31 引用Trackback(0) | 编辑 评论 发表评论 最后更新 ACE Tutorial [翻译] 05 -page05 ACE Tutorial [翻译] 05 -page04 ACE Tutorial [翻译] 05 -page03 ACE Tutorial [翻译] 05 -page02 ACE Tutorial [翻译] 05 -page01 ACE Tutorial [翻译] 04 ACE Tutorial [翻译] 03 ACE Tutorial [翻译] 02-page03 ACE Tutorial [翻译] 02-page02 ACE Tutorial [翻译] 02-page01