Focus on ACE

订阅 ace-china
电子邮件:
浏览存于 groups.google.com 上的所有帖子

C++博客 首页 新随笔 联系 聚合 管理
  64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks
#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();
}

书的几个印刷错误,修改后放在上面

测试说明
运行程序后,在19998端口等待客户的连接
建立连接后,收到12个字符号,回显示在屏幕上

telnet 127.0.0.1 19998
通过控制台输入字符,查看对端显示

posted on 2006-04-12 17:28 Stone Jiang 阅读(571) 评论(0)  编辑 收藏 引用 所属分类: ACE

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理