用ACE库实现服务器

来源:互联网 发布:单色led显示屏软件 编辑:程序博客网 时间:2024/05/07 15:34


使用ACE搭建服务器主要用到这几类:

  • ACE_SOCK_Connector:连接器,主动建立连接,用于Socket Client。
  • ACE_SOCK_Acceptor:接受器,被动建立连接,用于Socket Server。
  • ACE_SOCK_Stream:传输数据的流,用于传输数据。
  • ACE_INET_Addr:用于表示通信端点的地址。
ACE_SOCK_Acceptor::open(svc_addr,1) 服务器创建socket绑定自身端口和ip
ACE_SOCK_Acceptor::accept(svc_stream,&cli_addr) 服务器创建消息队列并监听,有客户端请求连接三次握手后接受请求
ACE_SOCK_Stream::recv(buffer,buff_size)把接受到的数据放到buff中,循环读取
ACE_SOCK_Stream::close()关闭接收流
ACE_SOCK_Acceptor::close()关闭服务器

#include <ace/Log_Msg.h>#include<ace/SOCK_Acceptor.h>#include<ace/SOCK_Stream.h>#include<ace/SOCK_Connector.h>#include<ace/INET_Addr.h>#define MAX_BUFF_SIZE     1024#define LISTEN_PORT       5010#define SERVER_IP        ACE_LOCALHOSTclass server{public:server(int port,char *ip);~server();bool open();bool run();void close();ACE_SOCK_Stream &get_stream();private:ACE_INET_Addr Svr_addr,Cli_addr;ACE_SOCK_Acceptor Svr_aceept;ACE_SOCK_Stream Svr_stream;};server::server(int  port,char *ip):Svr_addr(port,ip){};server::~server(){};bool server::open(){if(Svr_aceept.open(Svr_addr,1)==-1){ACE_DEBUG((LM_ERROR,ACE_TEXT("failed to accept\n")));return false;}return true;}bool server::run(){if(Svr_aceept.accept(Svr_stream,&Cli_addr)==-1){ACE_DEBUG((LM_ERROR,ACE_TEXT("failed to accept\n")));Svr_aceept.close();return false;}return true;}ACE_SOCK_Stream &server::get_stream(){return this->Svr_stream;}void server::close(){Svr_aceept.close();}int main(){server svr(LISTEN_PORT,(char*)SERVER_IP);char strBuffer[MAX_BUFF_SIZE];if(!svr.open()){return 0;}ACE_DEBUG((LM_INFO, ACE_TEXT("open success!\n")));if(!svr.run()){return 0;}ACE_DEBUG((LM_INFO, ACE_TEXT("run success!\n")));ACE_SOCK_Stream Svr_data = svr.get_stream();while(1){     int byte = Svr_data.recv(strBuffer,MAX_BUFF_SIZE);     if (-1 == byte)     {         ACE_DEBUG((LM_INFO, ACE_TEXT("receive data failed\n")));         break;      }     else if(0 == byte)     {         ACE_DEBUG((LM_INFO, ACE_TEXT("client closed!\n")));         break;     }     else     {         ACE_DEBUG((LM_INFO, ACE_TEXT("receive from client: %s\n"),strBuffer));         ACE_OS::memset(strBuffer, 0, sizeof(strBuffer));      }  } Svr_data.close(); svr.close(); return 0;}


开启服务器后:
#nc -v  localhost 5010
连接到服务器测试

原创粉丝点击