ACE框架簡介以及基於ACE的C

使用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/S服務應用實例

ACE的體系結構

從這個圖中,可以很明顯的看出,ACE框架從底層往上,依次是C風格的OS適配層,也就是對不同的操作系統底層調用的封裝;

上一層是C++的封裝類,就是把各種系統調用和系統對象封裝成C++類對象;

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

在上面就是ACE提供的一些服務組件

從這個結構圖中還可以看出,在C++封裝層,ACE框架還為我們提供了進程、線程管理,日誌記錄,內存管理等模塊。進程和線程管理可以用來方便的創建和管理進程、線程,還提供了各種機制實現線程同步。使用ACE的日誌模塊,我們可以很方便的記錄不同級別的日誌,並在實際運行過程中控制日誌記錄的級別。使用ACE的內存管理,我們可以預先分配一塊內存,這樣可以避免程序頻繁的向OS請求內存,使得程序的性能無論從時間上還是空間上都能得到很大的提升。內存管理還提供了進程間共享內存的內存分配方式。

使用ACE進行C/S結構程序,就是使用Reactor框架,實現事件處理方法。下面是一個使用ACE開發的通信系統的簡單的類圖:

ACE框架簡介以及基於ACE的C/S服務應用實例

其中需要開發的部分主要就是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:

ACE框架簡介以及基於ACE的C/S服務應用實例

下面是Client_svc_handler,它與server端的類似。

ACE框架簡介以及基於ACE的C/S服務應用實例

你們可能會注意到,Server_svc_handler實現了open方法,但是client端的處理函數卻沒有,是因為,open方法在ACE_svc_handler中就已經有默認實現,就是將當前的handler進行註冊:

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

因為在服務器端接收到客戶連接以後,給客戶端發了一個回應,所以我們才重新實現。

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

ACE框架簡介以及基於ACE的C/S服務應用實例

ServerAcceptor不需要實現,只需要用實現的handler定義就可以。

下面是客戶端的代碼client.cpp

ACE框架簡介以及基於ACE的C/S服務應用實例

這個例子只是對socket的可讀操作註冊處理器,在Reactor框架中,可以對任何的I/O操作的讀或者寫進行處理,也可以對系統的信號量註冊處理函數。

使用ACE框架,就可以把重心放在業務的處理上,而不用為底層的系統調用和錯誤處理費太多腦筋。上面的一個簡單的服務器端和客戶端通信的程序,代碼總共加起來就30,40行,但是也實現了完整的服務器與客戶端的交互,還是非常方便的。

如果想查看之前的C++的知識點,下面幾篇文章鏈接:

如果你想看網絡編程方面,可以查看以下幾篇文章鏈接:

喜歡我的文章的話,就關注我吧!不要只收藏和轉發哦,每天至少兩篇編程知識給大家,都是本人多年的經驗總結!


分享到:


相關文章: