此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意!@H_404_2@
ACE 使用方法及例子,网上有不少,下面贴一段我写的采用 ACE Reactor 模式写的 echo 服务的例子代码,通过例子可以看出,采用 ACE 开发多客户端的服务程序那是相当简单的!@H_404_2@
代码中,handle_input(@H_404_2@…@H_404_2@)@H_404_2@和 handle_output(@H_404_2@…@H_404_2@)@H_404_2@都会对 _bufs @H_404_2@进行操作,因为这两个函数都是运行在 reactor 的线程里,不会冲突,所以没有必要对 _bufs 的操作进行锁操作。
/* $Id: cpp.tpl 3412 2009-11-14 14:23:44Z luozhiyong $ */@H_404_2@
/**@H_404_2@
* \file ACEReactorSvrSample.cpp@H_404_2@
*@H_404_2@
*@H_404_2@
* \version $Rev: 3412 $@H_404_2@
* \author@H_404_2@
*@H_404_2@
* <table>@H_404_2@
* </tr>@H_404_2@
* </table>@H_404_2@
*/@H_404_2@
@H_404_2@
#else@H_404_2@
# define ACE_RT_OPT@H_404_2@
#endif@H_404_2@
@H_404_2@
#else@H_404_2@
# define ACE_LIB_THREAD_OPT "s"@H_404_2@
#endif@H_404_2@
@H_404_2@
#pragma@H_404_2@
comment@H_404_2@(
lib@H_404_2@,"ACE"@H_404_2@
ACE_LIB_THREAD_OPT@H_404_2@
ACE_RT_OPT@H_404_2@
".lib"@H_404_2@)
{
public@H_404_2@:
typedef@H_404_2@
ACE_Acceptor@H_404_2@<
my_type@H_404_2@, ACE_SOCK_ACCEPTOR@H_404_2@>
acceptor_type@H_404_2@;
EchoService@H_404_2@()
{
}
~
EchoService@H_404_2@()
{
}
{
if@H_404_2@ (
reactor@H_404_2@()->
register_handler@H_404_2@(
this@H_404_2@,ACE_Event_Handler@H_404_2@::
READ_MASK@H_404_2@))
{
return@H_404_2@ -1;
}
if@H_404_2@ (
reactor@H_404_2@()->
register_handler@H_404_2@(
this@H_404_2@,ACE_Event_Handler@H_404_2@::
WRITE_MASK@H_404_2@))
{
return@H_404_2@ -1;
}
reactor@H_404_2@()->
cancel_wakeup@H_404_2@(
this@H_404_2@,ACE_Event_Handler@H_404_2@::
WRITE_MASK@H_404_2@);
return@H_404_2@ 0;
}
{
ssize_t@H_404_2@
c@H_404_2@ =
_peer@H_404_2@.
recv@H_404_2@(
buf@H_404_2@,sizeof@H_404_2@(
buf@H_404_2@) - 1);
{
return@H_404_2@ -1;
}
{
reactor@H_404_2@()->
schedule_wakeup@H_404_2@(
this@H_404_2@,ACE_Event_Handler@H_404_2@::
WRITE_MASK@H_404_2@);
}
return@H_404_2@ 0;
}
{
{
char@H_404_2@
const@H_404_2@*
const@H_404_2@
e@H_404_2@(
s@H_404_2@ +
buf@H_404_2@.
size@H_404_2@());
{
{
{
break@H_404_2@;
}
else@H_404_2@{
break@H_404_2@;
}
}
else@H_404_2@{
}
}
{
}
else@H_404_2@{
break@H_404_2@;
}
}
{
reactor@H_404_2@()->
cancel_wakeup@H_404_2@(
this@H_404_2@,ACE_Event_Handler@H_404_2@::
WRITE_MASK@H_404_2@);
}
return@H_404_2@ 0;
}
int@H_404_2@
handle_close@H_404_2@(
ACE_HANDLE@H_404_2@ =
ACE_INVALID_HANDLE@H_404_2@,ACE_Reactor_Mask@H_404_2@
mask@H_404_2@ =
ACE_Event_Handler@H_404_2@::
ALL_EVENTS_MASK@H_404_2@)
{
return@H_404_2@ 0;
return@H_404_2@ 0;
}
{
}
{
}
{
}
private@H_404_2@:
};
{
ACE_Reactor@H_404_2@::
instance@H_404_2@(
new@H_404_2@
ACE_Reactor@H_404_2@(
new@H_404_2@
ACE_Select_Reactor@H_404_2@,true@H_404_2@));
{
fprintf@H_404_2@(
stderr@H_404_2@,"@H_404_2@
服务打开失败:%s\n"@H_404_2@,ACE_OS@H_404_2@::
strerror@H_404_2@(
ACE_OS@H_404_2@::
last_error@H_404_2@()));
return@H_404_2@ 1;
}
else@H_404_2@{
return@H_404_2@ 0;
}
}