ACE中的流包装提供面向连接的通信。流数据传输包装类包括ACE_SOCK_Stream和ACE_LSOCK_Stream,连接建立类包括针对TCP/IP的ACE_SOCK_Connector和ACE_SOCK_Acceptor,以及针对UNIX域socket的ACE_LSOCK_Connector和ACE_LSOCK_Acceptor。
1.下面创建一个被动服务器,侦听到来的客户连接。服务器接收来自客户的数据,然后关闭连接。连接关闭通过调用流上的close方法来完成,该方法会释放所有的socket资源并终止连接。
Server.h
#pragma once
#include "ace/Time_Value.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/Log_Msg.h"
#define SIZE_DATA 18
#define SIZE_BUF 1024
#define NO_ITERATIONS 5
class Server
{
public:
Server(int port);
~Server(void);
int handle_connection();
int accept_connections();
private:
char *data_buf_;
ACE_INET_Addr server_addr_;
ACE_INET_Addr client_addr_;
ACE_SOCK_Acceptor peer_acceptor_;
ACE_SOCK_Stream new_stream_;
};
Server.cpp
#include "Server.h"
Server::Server( int port ):server_addr_(port),
peer_acceptor_(server_addr_)
{
data_buf_=new char[SIZE_BUF];
}
Server::~Server(void)
{
}
int Server::accept_connections()
{
if(peer_acceptor_.get_local_addr(server_addr_)==-1)
ACE_ERROR_RETURN ((LM_ERROR,"%p\n","Error in get_local_addr"),1);
ACE_DEBUG ((LM_DEBUG,"Starting server at port %d\n",
server_addr_.get_port_number()));
while(1)
{
ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
if(peer_acceptor_.accept(new_stream_,&client_addr_,&timeout)== -1)
{
ACE_ERROR((LM_ERROR,"%p\n","accept"));
continue;
}
else
{
ACE_DEBUG((LM_DEBUG,
"Connection established with remote %s: %d\n",
client_addr_.get_host_name(),client_addr_.get_port_number()));
///handle the connection
handle_connection();
}
}
}
int Server::handle_connection()
{
//read data from client
for(int i=0; i< NO_ITERATIONS; i++)
{
int byte_count=0;
if((byte_count=new_stream_.recv_n(data_buf_,SIZE_DATA,0))== -1)
ACE_ERROR((LM_ERROR,"%p\n","Error in recv"));
else
{
data_buf_[byte_count]=0;
ACE_DEBUG((LM_DEBUG,"Server received %s \n",data_buf_));
}
}
//close new endpoint
if(new_stream_.close()== -1)
ACE_ERROR((LM_ERROR,"%p\n","close"));
return 0;
}
main.cpp
#include <QtCore/QCoreApplication>
#include "Server.h"
#include "ace/OS_NS_stdlib.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
if(argc< 2)
{
ACE_ERROR((LM_ERROR,"Usage %s <port_num>",argv[0]));
ACE_OS::exit(1);
}
Server server(ACE_OS::atoi(argv[1]));
server.accept_connections();
return a.exec();
}
以上代码摘自:ACE程序员教程。