ACE中的流包装提供面向连接的通信。流数据传输包装类包括ACE_SOCK_Stream和ACE_LSOCK_Stream,他们分别包装TCP/IP和UNIX域Socket协议数据传输功能。连接建立类包括针对TCP/IP的ACE_SOCK_Connector和ACE_SOCK_Acceptor,以及针对UNIX域Socket的ACE_LSOCK_Connector和ACE_LSOCK_Acceptor。
class Server
{
public:
Server (int port): server_addr_(port),peer_acceptor_(server_addr_)
{
data_buf_= new char[SIZE_BUF];
}
int handle_connection()
{
// Read data from client
int byte_count=0;
if( (byte_count=new_stream_.recv (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;
}
int 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();
}
}
}
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类中,创建了一个被动服务器,侦听到来的客户端连接,在连接建立之后,服务器接收来自客户端的数据,然后关闭链接。
Server类包含的accept_connection()方法使用接收器来将连接接受“进”ACE_SOCK_Stream new_stream_。该操作完成的基本流程是:调用接收器上的accept(),并将流作为参数传入其中。一旦连接已经建立进流中,流的包装方法send()和recv()就可以用来在新建立的链路上发送和接收数据,还有一个空的ACE_INET_Addr也被传入接收器的accept()方法,并在其中被设定为发起连接的远程机器地址。
在连接建立后,服务器调用handle_connection()方法,它开始从客户端那里收取一个预先知道的单词,然后将流关闭。连接关闭通过调用流上的close()方法来完成,该方法会释放所有的Socket资源并终止连接。
http://acme-ltt.iteye.com/blog/1455556中提到的ACE_Select_Reactor,在static ACE_THR_FUNC_RETURN controller (void *arg)函数中,调用上述的Server类,搭建基于ACE_Select_Reactor的Socket服务器网关。
客户端程序:
#include "ace/SOCK_Connector.h"
#include "ace/INET_Addr.h"
#include "ace/OS.h"
#include "ace/Log_Msg.h"
#include <stdlib.h>
#include "text.h"
#include "ace/Thread_Manager.h"
#include <iostream>
#define SIZE_BUF 128
static const ACE_Time_Value TIME_INTERVAL(0, 1000000);
class Client
{
public:
Client(char *hostname, int port):remote_addr_(port,hostname)
{
}
int connect_to_server()
{
ACE_DEBUG ((LM_DEBUG, "(%P|%t) Starting connect to %s:%d\n",
remote_addr_.get_host_name(),remote_addr_.get_port_number()));
if (connector_.connect (client_stream_, remote_addr_) == -1)
ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p\n","connection failed"),-1);
else
ACE_DEBUG ((LM_DEBUG,"(%P|%t) connected to %s\n",
remote_addr_.get_host_name ()));
return 0;
}
int send_to_server()
{
iovec iov[3];
iov[0].iov_base = (void *)"get";
iov[0].iov_len = 3;
iov[1].iov_base = getdata()/* some data */;
iov[1].iov_len = strlen(getdata());
iov[2].iov_base = (void *)"end.";
iov[2].iov_len = 4;
if (client_stream_.sendv_n (iov,3) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p\n","send_n"),0);
//break;
exit(0);
}
close();
}
int close()
{
if (client_stream_.close () == -1)
ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p\n","close"),-1);
else
return 0;
}
private:
ACE_SOCK_Stream client_stream_;
ACE_INET_Addr remote_addr_;
ACE_SOCK_Connector connector_;
char *data_buf_;
};
int main (int argc, char *argv[])
{
if(argc<3)
{
ACE_DEBUG((LM_DEBUG,”Usage %s <hostname> <port_number>\n”, argv[0]));
ACE_OS::exit(1);
}
Client client(argv[1],ACE_OS::atoi(argv[2]));
client.connect_to_server();
client.send_to_server();
}
客户端由单个Client类表示。Client含有connect_to_server()和send_to_server()方法。
connect_to_server()方法使用类型为ACE_SOCK_Connector的连接器来主动地建立连接。连接的设置通过调用连接器上的connect()方法来完成:传入的参数为想要连接的机器的远程地址,以及用于在其中建立连接的空ACE_SOCK_Stream 。远程机器在运行时参数中指定。一旦connect()方法成功返回,通过使用ACE_SOCK_Stream封装类中的send()和recv()方法族,流就可以用于在新建立的链路上发送和接收数据。
在该代码中,一旦连接建立好,send_to_server()方法就会被调用,将一个iovec类型的数组,用sendv_n()方法,发送到服务器上。
分享到:
相关推荐
2. **事件分发**:ACE Reactor会根据事件类型,将事件分发给相应的处理函数。它可以处理I/O完成、定时器到期等多种事件。 3. **非阻塞I/O**:ACE Reactor支持非阻塞I/O,使得服务器在等待数据到来时可以处理其他...
2. `ACE_Reactor`:管理事件,如I/O完成、定时器触发等,采用非阻塞I/O模型。 3. `ACE_Svc_Handler`:处理具体的业务逻辑,继承自`ACE_Event_Handler`,实现读写回调函数。 4. `ACE_Thread_Manager`:用于管理线程,...
在ACE_Client_1中,可能会使用到ACE_Wait_for_Single_Ready或者ACE_Select_Reactor等组件,来等待数据的到来并进行相应的处理。这种编程模型对于构建高性能、高并发的客户端应用尤其关键。 此外,ACE提供了线程管理...
- **reactor(ACE_Reactor*)**: 设置与此事件处理器关联的`ACE_Reactor`实例。 - **reactor()**: 获取当前关联的`ACE_Reactor`实例。 ##### 3. 事件掩码 - **READ_MASK**: 表示读就绪事件。 - **WRITE_MASK**: ...
标题中的"ace_send.rar_ACE_pop"提示我们讨论的主题与ACE库有关,特别是关于发送(send)和弹出(pop)信息的实现。ACE库,全称Adaptive Communication Environment,是一个跨平台的C++框架,主要用于分布式系统和...
例如,ACE_Select_Reactor 和 ACE_WFMO_Reactor 是 ACE_Reactor 的两个具体实现。它们都实现了 Reactor_Impl 接口,并定义了其具体实现。在 ACE 框架中,还有其他类型的 Reactor,例如 ACE_Dev_Poll_Reactor 和 ACE_...
标题中的"ACE.zip_ACE_ACE p_ACE source code"表明这是一个包含ACE库源代码的压缩文件。"ACE p"可能是指"ACE Proactor",它是ACE库的一部分,提供了异步事件处理的能力。"ACE source code"则直接指明了压缩包内的...
再者,ACE库提供了强大的I/O复用机制,如ACE_Select_Reactor和ACE.epoll_Reactor,它们分别对应于select和epoll系统调用,能够在Linux上实现高效的大规模并发连接处理。ACE_TSS(Thread Specific Storage)类允许...
A continuous stirred tank reactor (CSTR) for an exothermic reaction A → B. The component and energy balance of the dynamic model are derived by assuming constant liquid volume. The equations are ...
2. **创建Acceptor**:使用`ACE_Acceptor`或`ACE_Reactor`的派生类来监听指定端口上的连接请求。这通常涉及到创建一个`ACE_SOCK_Acceptor`实例,并绑定到一个端口上。 3. **定义Svc_Handler**:继承`ACE_Svc_...
2. **网络编程**:ACE提供了丰富的网络编程接口,如TCP/UDP套接字、多路复用I/O(如select、poll、epoll)、异步I/O等,方便开发高性能的网络应用。 3. **并发处理**:ACE支持线程和进程的管理,包括线程池、进程间...
3. **I/O复用**:ACE的Reactor模式实现了异步I/O,支持select、poll、epoll等不同操作系统的I/O复用机制。 4. **TCP/UDP套接字**:提供了一组封装了底层网络协议的类,简化了网络通信代码的编写。 5. **命名服务**...
4. **启动服务器**: 通过调用ACE_Reactor的register_handler()函数注册服务处理程序,并调用ACE_SOCK_Acceptor::accept()开始监听连接。 5. **客户端连接**: 客户端使用ACE_SOCK_Connector类尝试连接到服务器。连接...
4. **WSOCK32**和**WS2_32**:这些可能是Windows平台下的特定库,用于提供Winsock API的接口,以便在Windows系统上进行网络编程。 5. **Config**:配置文件通常用于设置编译选项、路径和其他系统特定的参数,使得...
3. **ACE_Select_Reactor** 和 **ACE_Proactor**:这两种是ACE提供的不同类型的Reactor实现。ACE_Select_Reactor基于select()系统调用,适合小型应用。ACE_Proactor则采用异步I/O模型,适用于大型并发系统。 4. **...
Ace Reactor提供了多种反应器实现,包括基于select、poll、epoll等不同操作系统原生API的版本,以适应不同的性能和规模需求。例如,Linux系统的epoll机制在高并发下表现出色,因为它支持水平触发和边缘触发两种模式...
- 第4章提供了ACE反应器不同实现的详细介绍,包括ACE_Select_Reactor、ACE_TP_Reactor和ACE_WFMO_Reactor类,每种实现都有其特定的使用场景和优势。 5. ACE服务配置器框架 - 第5章介绍了ACE服务配置器框架,展示...
4. **I/O复用**:ACE_Reactor模式是ACE的核心,它支持多路复用I/O(如select、poll、epoll),实现异步事件处理。 5. **并发和同步**:ACE_Guard、ACE_Read_Guard和ACE_Write_Guard用于互斥访问,ACE_Synch_Round_...
在接下来的部分,我们将详细介绍ACE的核心功能之一——Reactor模型。 #### 3. ACE Reactor框架 ##### 3.1 Reactor(反应器)框架 Reactor模式是一种常见的事件驱动设计模式,它将事件处理与事件接收解耦,使得系统...
2. 创建客户端:使用ACE_Connector建立到服务器的连接。 3. 数据传输:通过ACE_SOCK_Stream读写数据,实现客户端和服务器间的通信。 通过深入阅读和实践"ACE.chm"文档,你将能够掌握ACE的基本用法,理解其设计哲学...