#ifdef?_DEBUG
#pragma?comment?(lib,
"
aced.lib
"
)
#else
#pragma?comment?(lib,
"
ace.lib
"
)
#endif
#include?
"
ace/Reactor.h
"
#include?
"
ace/SOCK_Acceptor.h
"
#define
?PORT_NO?19998
typedef?ACE_SOCK_Acceptor?Acceptor;
//
forward?declaration
class
?My_Accept_Handler;

class
?My_Input_Handler:
public
?ACE_Event_Handler

{
public
:
????
//
construcor
????My_Input_Handler()

????
{
????????ACE_DEBUG((LM_DEBUG,
"
Constructor\n
"
));
????}
????
//
Called?back?to?handle?any?input?received
????
int
?handle_input(ACE_HANDLE)

????
{
????????
//
receive?the?data
????????peer().recv_n(data,
12
);
????????ACE_DEBUG((LM_DEBUG,
"
%s\n
"
,data));

????????
//
?do?something?with?the?input?received.
????????
//
?
????????
//
?keep?yourself?registerd?with?the?reator
????????
return
?
0
;
????}
????
//
Used?by?the?reactor?to?determine?the?underlying?handle
????ACE_HANDLE?get_handle()??
const
?

????
{
????????
return
?
this
->
peer_.get_handle();
????}
????
//
Returns?a?reference?to?the?underlying?stream.
????ACE_SOCK_Stream
&
?peer()

????
{
????????
return
?
this
->
peer_;
????}
private
:
????ACE_SOCK_Stream?peer_;
????
char
?data?[
12
];
}
;

class
?My_Accept_Handler:
public
?ACE_Event_Handler

{
public
:
????
//
Constructor
????My_Accept_Handler(ACE_Addr?
&
addr)

????
{
????????
this
->
open(addr);
????}
????
//
Open?the?peer_acceptor?so?it?starts?to?"listen"
????
//
for?incoming?clients
????
int
?open(ACE_Addr?
&
addr)

????
{
????????peer_acceptor.open(addr);
????????
return
?
0
;
????}
????
//
Overload?the?handle?input?method
????
int
?handle_input(ACE_HANDLE?handle)

????
{
????????
//
Client?has?requested?connection?to?server.
????????
//
Create?a?handler?to?handle?the?connection
????????My_Input_Handler?
*
eh?
=
?
new
?My_Input_Handler();

????????
//
Accept?the?connection?"into"?the?Event?Handler
????????
if
(
this
->
peer_acceptor.accept(eh
->
peer(),
//
stream
????????????
0
,
//
remote?address
????????????
0
,
//
timeout
????????????
1
)?
==
?
-
1
)
//
restart?if?interrupted
????????????ACE_DEBUG((LM_ERROR,
"
Error?in?connection?\n
"
));
????????
????????ACE_DEBUG((LM_DEBUG,
"
Connection?established\n
"
));

????????
//
Register?the?input?event?handler?for?reading?
????????ACE_Reactor::instance()
->
register_handler(eh,ACE_Event_Handler::READ_MASK);

????????
//
Unregister?as?the?acceptor?is?not?expecting?new?clients
????????
return
?
-
1
;
????}
????
//
Used?by?the?reactor?to?determine?the?underlying?handle
????ACE_HANDLE?get_handle(
void
)?
const
????
{
????????
return
?
this
->
peer_acceptor.get_handle();
????}
private
:
????Acceptor?peer_acceptor;
}
;

int
?ACE_TMAIN(
int
?argc,
char
?
*
argv[])

{
????
//
Create?an?address?on?which?to?receive?connections
????ACE_INET_Addr?addr(PORT_NO);

????
//
Create?the?Accept?Handler?which?automatically?begins?to?"listen"
????
//
for?client?requests?for?connections
????My_Accept_Handler?
*
eh
=
new
?My_Accept_Handler(addr);

????
//
Register?the?reator?to?call?back?when?incoming?client?connects?
????ACE_Reactor::instance()
->
register_handler(eh,ACE_Event_Handler::ACCEPT_MASK);

????
//
Start?the?event?loop
????
while
(
1
)
????????ACE_Reactor::instance()
->
handle_events();
}
書的幾個(gè)印刷錯(cuò)誤,修改后放在上面
測試說明
運(yùn)行程序后,在19998端口等待客戶的連接
建立連接后,收到12個(gè)字符號,回顯示在屏幕上
telnet 127.0.0.1 19998
通過控制臺輸入字符,查看對端顯示