ACE学习之创建简单的服务器端和客户端

来源:互联网 发布:sql循环语句 update 编辑:程序博客网 时间:2024/05/22 14:17

ACE入门学习之创建简单的服务器端和客户端


ACE自适配通行环境(Adaptive Communicatin Environment)是面向对象的框架和工具包。它为通信软件实现了核心的并发和分布式模式。


ACE具有分层的体系结构,基本分为三层:

1. 操作系统适配层(OS)

2. C++包装层

3. 框架和模式层


Sock类属(ACE_SOCK):

1.   Dgram类和Stream类:Dgram类基于UDP数据报协议,提供不可靠的无连接消息传递功能。另一方面,Stream类基于TCP协议,提供面向连接的消息传递.

2.   Acceptor、Connector类和Stream类:Acceptor和Connector类分别用于被动和主动地建立连接。Acceptor类封装BSD accept()调用,而Connector封装BSD connect()调用。Stream类用于在连接建立之后提供双向的数据流,并包含有发送和接收.

 

ACE中流包装中提供面向连接的通信,数据传输类包括ACE_SOCK_Stream类,建立连接的针对于TCP/IP的ACE_SOCK_Connector 和 ACE_SOCK_Acceptor.

 

创建一个服务器端所要创建的变量:

ACE_INET_Addr  server_addr_;

    ACE_SOCK_Acceptor

    ACE_SOCK_Connector

    ACE_SOCK_Stream


而客户端则多了个:

ACE_SOCK_Connector

服务器开启侦听代码:

Cpp代码  收藏代码
  1. //ACE_Server.h  
  2. #include"ace/SOCK_Acceptor.h"  
  3. #include"ace/SOCK_Stream.h"  
  4. #include"ace/Log_Msg.h"  
  5. #include"ace/Time_Value.h"  
  6.    
  7. #define SIZE_DATA       18  
  8. #define SIZE_BUF        1024  
  9. #define NO_INTERATION   5  
  10.    
  11. class ACE_Server  
  12. {  
  13. public:  
  14.        ACE_Server(int port);  
  15.        ~ACE_Server();  
  16.        int handle_connection();  
  17.        int accept_connections();  
  18.    
  19. private:  
  20.        char *data_buf_;  
  21.        ACE_INET_Addr server_addr_;  
  22.        ACE_INET_Addr client_addr_;  
  23.        ACE_SOCK_Acceptor peer_acceptor_;  
  24.        ACE_SOCK_Stream new_stream_;  
  25. };  
  26.   
  27. //ACE_Server.cpp  
  28. #include"stdafx.h"  
  29. #include"ACE_Server.h"  
  30.    
  31. ACE_Server::ACE_Server(int port) : server_addr_(port), peer_acceptor_(server_addr_)  
  32. {  
  33.        data_buf_ = newchar[SIZE_BUF];  
  34. }  
  35.    
  36. ACE_Server::~ACE_Server()  
  37. {  
  38.        delete []data_buf_;  
  39.        data_buf_ = NULL;  
  40. }  
  41.    
  42. int ACE_Server::handle_connection()  
  43. {  
  44.        for (int i=0; i < NO_INTERATION; i++)  
  45.        {  
  46.               int byte_count = 0;  
  47.               if ((byte_count = new_stream_.recv(data_buf_,SIZE_DATA,0)) == -1)  
  48.               {  
  49.                      ACE_ERROR ((LM_ERROR, "%p\n""Error in recv"));  
  50.               }  
  51.               else  
  52.               {  
  53.                      data_buf_[byte_count] = '\0';  
  54.                      ACE_DEBUG((LM_DEBUG,"Server received %s \n",data_buf_));  
  55.               }  
  56.    
  57.        }  
  58.    
  59.        if (new_stream_.close() == -1)  
  60.                      ACE_ERROR((LM_ERROR, "%p\n","Close Error"));  
  61.    
  62.               return0;  
  63. }  
  64.    
  65. int ACE_Server::accept_connections()  
  66. {  
  67.        if (peer_acceptor_.get_local_addr(server_addr_) == -1)  
  68.               ACE_ERROR_RETURN((LM_ERROR,"%p \n","Error in get_local_addr"),1);  
  69.    
  70.        ACE_DEBUG((LM_DEBUG,"Starting server at port: %d \n",server_addr_.get_port_number()));  
  71.    
  72.        while(1)  
  73.        {  
  74.               ACE_Time_Value timeout(ACE_DEFAULT_TIMEOUT);  
  75.               if (peer_acceptor_.accept(new_stream_,&client_addr_,&timeout) == -1)  
  76.               {  
  77.                      ACE_ERROR((LM_ERROR,"%p \n","Accept"));  
  78.                      continue;  
  79.               }  
  80.               else  
  81.               {  
  82.                      ACE_DEBUG((LM_DEBUG,"Connection established with remote %s : %d \n",  
  83.                             client_addr_.get_host_name(), client_addr_.get_port_number()));  
  84.    
  85.                      handle_connection();  
  86.               }  
  87.        }  
  88. }  
  89.   
  90. //main  
  91. #include"ACE_Server.h"  
  92. int _tmain(int argc, _TCHAR* argv[])  
  93. {  
  94.        WORD wVersionRequested;  
  95.        WSADATA wsaData;  
  96.        int err;  
  97.           
  98.        wVersionRequested = MAKEWORD( 2, 2 );  
  99.           
  100.        err = WSAStartup( wVersionRequested, &wsaData );  
  101.        if ( err != 0 ) {  
  102.               return0;  
  103.        }  
  104.           
  105.        if ( LOBYTE( wsaData.wVersion ) != 2 ||  
  106.                       HIBYTE( wsaData.wVersion ) != 2 ) {  
  107.               WSACleanup( );  
  108.               return0;  
  109.        }  
  110.    
  111.    
  112.        ACE_Server server(1234);  
  113.        server.accept_connections();  
  114.        getchar();  
  115.        return0;  
  116. }  

客户端

Cpp代码  收藏代码
  1. //Client.h:  
  2. #define SIZE_BUF        128  
  3. #define NO_INTERATION   5  
  4.    
  5. class ACE_Client_  
  6. {  
  7. public:  
  8.        ACE_Client_(char* hostname, int port);  
  9.        int connect_to_server();  
  10.        int send_to_server();  
  11.        int close();  
  12.   
  13. private:  
  14.        ACE_SOCK_Stream          client_stream_;  
  15.        ACE_INET_Addr        remote_addr_;  
  16.        ACE_SOCK_Connector connector_;  
  17.        char*                           data_buf_;  
  18. };  
  19.    
  20. //Client.cpp  
  21. #include"stdafx.h"  
  22. #include"Client.h"  
  23. ACE_Client_::ACE_Client_(char* hostname, int port) : remote_addr_(port, hostname)  
  24. {  
  25.        data_buf_ = "Hello from Client";  
  26. }  
  27.    
  28. int ACE_Client_::connect_to_server()  
  29. {  
  30.        ACE_DEBUG((LM_DEBUG, "(%P | %T) Starting connect to %s:%d \n",  
  31.               remote_addr_.get_host_name(), remote_addr_.get_port_number()));  
  32.    
  33.        if (connector_.connect(client_stream_, remote_addr_) == -1)  
  34.        {  
  35.               ACE_ERROR_RETURN((LM_ERROR,"(%p | %t) %p\n""Connection failed"), -1);  
  36.        }  
  37.        else  
  38.        {  
  39.               ACE_DEBUG((LM_DEBUG, "(%P | %T) connected to %s\n", remote_addr_.get_host_name()));  
  40.        }  
  41.    
  42.        return0;  
  43. }  
  44.    
  45. int ACE_Client_::send_to_server()  
  46. {  
  47.        for (int i=0; i < NO_INTERATION; i++)  
  48.        {  
  49.               if (client_stream_.send_n(data_buf_, strlen(data_buf_)+1, 0) == -1 )  
  50.                      ACE_ERROR_RETURN((LM_ERROR, "(%p | %t) %p\n""send to"), 0);  
  51.               else  
  52.                      ACE_DEBUG((LM_DEBUG, "(%T) Send Message to Server\n"));  
  53.        }  
  54.    
  55.        close();  
  56. }  
  57.   
  58. int ACE_Client_::close()  
  59. {  
  60.        if (client_stream_.close() == -1)  
  61.               ACE_ERROR_RETURN((LM_ERROR, "(%p | %t) %p \n""close"), -1);  
  62.        else  
  63.               return0;  
  64. }  
  65.    
  66. //main  
  67. int _tmain(int argc, _TCHAR* argv[])  
  68. {  
  69.        WORD wVersionRequested;  
  70.        WSADATA wsaData;  
  71.        int err;  
  72.           
  73.        wVersionRequested = MAKEWORD( 2, 2 );  
  74.           
  75.        err = WSAStartup( wVersionRequested, &wsaData );  
  76.        if ( err != 0 ) {  
  77.               return0;  
  78.        }  
  79.           
  80.        if ( LOBYTE( wsaData.wVersion ) != 2 ||  
  81.                       HIBYTE( wsaData.wVersion ) != 2 ) {  
  82.               WSACleanup( );  
  83.               return0;  
  84.        }  
  85.    
  86.        ACE_Client_   client("wangj",1234);  
  87.        client.connect_to_server();  
  88.        client.send_to_server();  
  89.        getchar();  
  90.        return0;  
  91. }