首页 > 文章资讯 > 新闻资讯
ACE框架简介以及基于ACE的C/S服务应用实例
更新时间:2022-08-19 03:06:27 作者:云寺手游

使用C++,C/S结构的系统的开发,其中server端的系统要实现Linux和windows系统的跨平台。因为系统的结构和业务逻辑都不太复杂,如果不使用类似ACE或BoOSt之类的库,而是由自己实现。在实现过程中,可能会遇到很多麻烦困难,例如:

a) 跨平台。这一点相对比较容易,主要是针对类似多线程、socket通信等操作,定义统一的接口,使用define实现。基本上,只要定义良好,使用起来就很方便,也不需要多少改动。

b) Socket通信。在socket通信过程中,除了我们实际收发的数据,也有很多其他的数据需要处理,如keep-alive信息、socket关闭或者各种出错信息等。这些都大大增加了代码的复杂度。

c) 多线程。多线程操作socket或者数据,要考虑同步等问题

d) 对各种系统API的操作,特别是socket的操作,要有很多错误处理的代码,大大增加了代码复杂度。

e) 还有许多其他问题。

所有这些问题,不仅增加了系统的复杂度,使得程序调试以及后期维护的难度大大增加。于是,考虑使用ACE框架比较靠谱,主要使用ACE的事件机制来实现socket通信的功能。


ACE的体系结构

从这个图中,可以很明显的看出,ACE框架从底层往上,依次是C风格的OS适配层,也就是对不同的操作系统底层调用的封装;

上一层是C++的封装类,就是把各种系统调用和系统对象封装成C++类对象;

再往上就是框架层,主要就是Reactor, Acceptor, Connector和Proactor。

在上面就是ACE提供的一些服务组件。

从这个结构图中还可以看出,在C++封装层,ACE框架还为我们提供了进程、线程管理,日志记录,内存管理等模块。进程和线程管理可以用来方便的创建和管理进程、线程,还提供了各种机制实现线程同步。使用ACE的日志模块,我们可以很方便的记录不同级别的日志,并在实际运行过程中控制日志记录的级别。使用ACE的内存管理,我们可以预先分配一块内存,这样可以避免程序频繁的向OS请求内存,使得程序的性能无论从时间上还是空间上都能得到很大的提升。内存管理还提供了进程间共享内存的内存分配方式。

使用ACE进行C/S结构程序,就是使用Reactor框架,实现事件处理方法。下面是一个使用ACE开发的通信系统的简单的类图:


其中需要开发的部分主要就是Server_svc_handler和Client_svc_handler,这两个对象都是继承自ACE_svc_handler。用来处理建立(接受)连接,以及进行数据的通信和处理。

Server_acceptor是用于在服务器上接受连接,它与Server_svc_handler绑定,每当有新的连接时,ACE的Reactor框架就会创建一个Server_svc_handler的对象,然后把新连接的socket(ACE_SOCK_STREAM)绑定到这个handler上,以后就用这个handler处理这个socket上接收到的数据。

Client_connector与Acceptor类似,用于在客户端连接服务器,连接成功后,也由Reactor框架创建一个Client_svc_handler对象,并将它与连接后的socket绑定,来处理从服务器端接收到的数据。

下面就是几个类的代码。

Server_svc_handler:


下面是Client_svc_handler,它与server端的类似。


你们可能会注意到,Server_svc_handler实现了open方法,但是client端的处理函数却没有,是因为,open方法在ACE_svc_handler中就已经有默认实现,就是将当前的handler进行注册:

ACE_Reactor::instance()->register_handler(this, ACE_Event_Handler::READ_MASK);

因为在服务器端接收到客户连接以后,给客户端发了一个回应,所以我们才重新实现。

接下来就是Server端的主程序server.cpp


ServerAcceptor不需要实现,只需要用实现的handler定义就可以。

下面是客户端的代码client.cpp


这个例子只是对socket的可读操作注册处理器,在Reactor框架中,可以对任何的I/O操作的读或者写进行处理,也可以对系统的信号量注册处理函数。

使用ACE框架,就可以把重心放在业务的处理上,而不用为底层的系统调用和错误处理费太多脑筋。上面的一个简单的服务器端和客户端通信的程序,代码总共加起来就30,40行,但是也实现了完整的服务器与客户端的交互,还是非常方便的。

如果想查看之前的C++的知识点,下面几篇文章链接:

C++基础知识点第七天

C++基础知识点第六天

C++基础知识第五天(面试必备)

C++基础知识第四天(面试必备)

C++基础知识第三天(面试必备)

C++基础知识第二天

C++基础知识第一天

如果你想看网络编程方面,可以查看以下几篇文章链接:

高级网络编程之疑症:清掉TIME_WAIT的奇怪技巧

高级网络编程之疑症:TCP的延迟确认机制

高级网络编程之疑症:TCP的头号疼症TIME_WAIT状态(下篇)

高级网络编程之疑症:TCP 的头号疼症 TIME_WAIT

高级网络编程之疑症:TCP 的 Peer 两端同时断开连接

高级网络编程之疑症:TCP 连接的初始化序列号能否固定?

高级网络编程之疑症:初始化连接的 SYN 超时问题

高级网络编程之疑症:四次挥手能不能变成三次挥手呢?

喜欢我的文章的话,就关注我吧!不要只收藏和转发哦,每天至少两篇编程知识给大家,都是本人多年的经验总结!
猜你喜欢
最新资讯