`
pleasetojava
  • 浏览: 730054 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ACE小技巧:在ACE_Acceptor框架中,自定义服务处理器的创建

阅读更多

ACE小技巧:在ACE_Acceptor框架中,自定义服务处理器的创建

Stone Jiang

ACE_Acceptor框架使对新连接的侦听变得容易,也使创建和激活新连接的ACE_Svc_Handler的派生类变得容易。之前我们已经了解了ACE_Svc_Handle::open()挂勾函数和服务处理器初始化时它所扮演的角色。本文我们回退几步,来了解服务处理器是如何实例化的以及我们如何自定义它的行为。

再看看ACE_Acceptor类,它是一个模板类,第一个模板参数ACE_Accetpor是代表与服务建立连接的处理器。当新的连接建立时,ACE_Acceptor调用make_svc_handler()挂勾函数来实际创建的新建服务处理器对象。ACE_Acceptor::make_svc_handler()的实现如下:

template<classSVC_HANDLE,ACE_PEER_ACCEPTOR_1>
int
ACE_Acceptor
<SVC_HANDLE,ACE_PEER_ACCEPTOR_2>::make_svc_handler(SVC_HANDLE*&sh)
{
ACE_TRACE(
"ACE_Acceptor<SVC_HANDLER,ACE_PEER_ACCEPTOR_2>::make_svc_handler");if(sh==0)
ACE_NEW_RETURN(sh,
SVC_HANDLER,
-1);//Setthereactorofthenewlycreated<SVC_HANDLER>tothesame
//reactorthatthis<ACE_Acceptor>isusing.
sh->reactor(this->reactor());
return0;

}

默认的实现包括了两步基本操作:
1. 获得一个新的SVC_HANLDER对象, 这里是使用的new运算符分配的。
2. 设置新的服务处理器的reactor指针为ACE_Accetpor使用的reactor的。

然而,如果应用程序需要通过其它方式获得SVC_HANDLER对象,而不是通过默认的构造函数那种动态分配,这又该怎么办呢?举例来说,我们可能需要:
. 从一个预分配的池中获得SVC_HANDLER对象;
. 为新创建的SVC_HANDLER传入一些额外的信息
. 使用单体的SVC_HANDLER

上面这些情形,我们都可以自定义make_svc_handler()挂勾函数来实现必要的行为。例如,假定我们新的处理器需要拥有一个处理所有对所有接收到的消息进行集中处理的中心处理器。这个中心处理器我们用类Processor表示。我们需要每个服务处理器都拥有一个指向中心处理器的指针,而不是使Processor成为一个全局访问的指针(使用全局变量的种种弊端本文不作详述)。我们的解决办法是: 从ACE_Accetor派生一个新类,这个新类拥有Processor的指针作成员,并且,在创建新和服务处理器(Service)的时候,把这个 Processor的指针作参数传进去。

新的acceptor类可以这样定义:

classMy_Acceptor:publicACE_Acceptor<Service,ACE_SOCK_ACCEPTOR>
...{
public:
My_Acceptor(Processor
*processor):processor_(processor)...{};

intmake_svc_handler(Service*&sh)
...{
if(sh==0)
ACE_NEW_RETURN(sh,
Service(
this->processor_),
-1);//Setthereactorofthenewlycreated<SVC_HANDLER>tothesame
//reactorthatthis<ACE_Acceptor>isusing.
sh->reactor(this->reactor());
return0;
}


private:
Processor
*processor_;
}

就这样,现在,当My_Acceptor接受新连接的时候,make_svc_handler()挂勾函数分配一个新的处理器(Service),并把Processor*作为参数传进去。需要注意的事,尽管这里使用

的是这一个构造函数Service(Processor*)。我们仍需求为Service类定义默认的构造函数,以满足模板类ACE_Acceptor的需要。

分享到:
评论

相关推荐

    ACE编写的简单网络服务器

    通常,服务器会创建一个`ACE_Svc_Handler`实例,然后将其注册到ACE的IO复用机制(如`ACE_Reactor`或`ACE_Selector`)中,这样当有新的连接请求时,ACE就会调用相应的处理器方法。 在创建网络服务器的过程中,以下是...

    ACE_server.rar_ACE server_ACE tcp_ACE_SERVER_ACE框架_ace server cl

    在“ACE_server.rar”这个压缩包中,包含的是使用ACE库搭建的一个TCP服务器和客户端框架。这个框架设计得简洁且易于扩展,适合开发者快速构建自己的网络服务。 首先,我们来了解一下ACE库的核心特性。ACE是一个开源...

    ACE_SOCK_TCP.rar_ACE_ACE TCP C++_ACE tcp_ace-6

    在“ACE_SOCK_TCP.rar”压缩包中的示例代码“ACE_SOCK_TCP”,可能包含了服务器端和客户端的实现,展示了如何使用ACE库搭建一个基本的TCP通信框架。通过分析和学习这些代码,开发者可以深入理解ACE库在TCP通信中的...

    ACE-inheritance

    - `ACE_Svc_Handler`:服务处理器,处理连接上的具体数据交互。 - `ACE_Task`:代表一个可以独立运行的任务,通常用于执行后台任务或定时器处理。 #### 连接策略与资源管理 ACE提供了多种连接策略和资源管理类,...

    ACE.rar_ACE 网络 编程_visual c

    《ACE网络编程与Visual C++实战指南》 ACE(Adaptive Communication Environment)...通过深入阅读和实践"ACE.chm"文档,你将能够掌握ACE的基本用法,理解其设计哲学,从而在实际项目中灵活运用,提升网络编程的能力。

    ACE资料系列5 - ACE程序员指南 ACE程序员指南:网络与系统编程的实用设计模式

    2. **ACE框架组件**:包括Acceptor-Connector设计模式、Reactor事件多路复用机制、Thread Pool、Strategy和Observer等模式的实现,这些都是ACE的核心组成部分,用于解决并发编程和网络通信中的常见问题。 3. **网络...

    ACE技术内幕:深入解析ACE架构设计与实现原理

    《ace技术内幕:深入解析ace架构设计与实现原理》从构架模式、编程示例和源代码3个维度系统地对经典网络框架ace(adaptivemunicationenvironment)的架构设计和实现原理进行了深入分析,它能解决4个方面的问题:,...

    ACE开发指南(初级).

    在ACE框架中,`ACE_Event_Handler`类是所有事件处理器的基类。任何想要处理特定事件的类都需要继承自这个基类,并实现相应的事件处理方法。 ```cpp class MyHandler : public ACE_Event_Handler { public: int ...

    ace_socket.zip_ace socket_linux 服务器

    在“ace_socket.zip_ace socket_linux 服务器”项目中,我们将关注如何在Linux服务器上构建一个基于ACE的socket服务端。以下是主要步骤: 1. **安装ACE库**:首先,你需要在Linux服务器上安装ACE库。这通常通过编译...

    ace技术内幕实例代码

    1. **ACE_Win32_Acceptor** 和 **ACE_SOCK_Acceptor**:这两个类是ACE中的服务器端接口,用于接收客户端连接。它们在TCP/IP通信中扮演着监听和接受新连接的角色。 2. **ACE_Win32_Connector** 和 **ACE_SOCK_...

    ACE_server.rar_ACE server

    4. **启动服务器**: 通过调用ACE_Reactor的register_handler()函数注册服务处理程序,并调用ACE_SOCK_Acceptor::accept()开始监听连接。 5. **客户端连接**: 客户端使用ACE_SOCK_Connector类尝试连接到服务器。连接...

    ACE网络编程基本框架

    在ACE中,网络通信的基本架构主要涉及以下关键组件: 1. **ACE_INET_Addr**:这个类用于封装网络地址,包括IP地址和端口号。在示例中,我们使用`ACE_INET_Addr`创建了一个地址对象,指定了服务器监听的端口号(5050...

    ACE编程(linux平台)归类.pdf

    - **接收端**:通常会创建一个继承自`ACE_Svc_Handler&lt;ACE_SOCK_STREAM, ACE_MT_SYNCH&gt;`的服务处理器`message_receiver`,它负责接收消息。接收到消息后,根据消息长度创建`ACE_Message_Block`,并将消息放入消息...

    ACE 程序员指南 源代码

    《ACE程序员指南》是一本深度探讨ACE(Adaptive Communication Environment)框架的专业书籍,该框架是用于构建高效率、跨平台的分布式系统的重要工具。源代码是书中理论与实践结合的关键部分,提供了丰富的示例,...

    ACE编程(linux平台)[归类].pdf

    在ACE中,可以通过`ACE_Thread_Mutex`实现线程同步,防止多个线程同时访问同一资源。线程间的事件通知可以利用`ACE_Condition&lt;ACE_Thread_Mutex&gt;`,而数据传递则可以借助消息机制。 3. **守卫类(Guard)**:ACE...

    ACE库(linux)

    ACE库,全称为Adaptive Communication Environment,是一款跨平台的C++框架,专为构建高性能、高可靠性的网络和分布式系统而设计。在Linux环境中,ACE库提供了丰富的接口和功能,帮助开发者解决网络通信中的各种复杂...

    ACE继承层次图

    7. **ACE_Svc_Handler**:服务处理器基类,通常用于处理特定的网络请求。 8. **ACE_Test_and_Set**:实现了原子的测试并设置操作,用于线程同步。 9. **ACE_Naming_Context**:命名服务接口,用于定位和查找网络...

    C++网络编程卷2-基于ACE和框架的系统化复用(1/1)

    《C++网络编程卷2-基于ACE和框架的系统化复用》是深入探讨C++在网络编程领域的经典著作,尤其关注使用ACE库进行系统化复用的实践与理论。本书主要针对那些希望利用C++构建高效、可靠和可扩展的网络应用的开发者,...

    ACE资料系列2 - 例子学习

    4. **I/O复用**:ACE_Win32_Acceptor和ACE_SOCK_Acceptor是ACE中处理网络连接的关键类。它们利用了操作系统的I/O复用机制,如Windows的WSAAsyncSelect或Unix的select/poll/epoll,实现高效并发的服务器端编程。 5. ...

Global site tag (gtag.js) - Google Analytics