ace網路編程
① 怎麼學習C++設計模式舉例說明
說起C++ 的系統和網路編程開源庫,恐怕沒有人敢否認ACE的王者地位。其實ACE不光是一個實用的程序庫和框架集,它更是一個設計模式的典範應用。ACE在線索引文檔:http://www.dre.vanderbilt.e/Doxygen/Stable/ace/index.html
ACE具有極其明顯的分層體系結構,一般劃分為三個層次:
1. 操作系統適配層
2. C++包裝層
3. 構架和模式層
前面的兩層都是對各個平台的底層OS API進行包裝,最後化身成通用的C++類或者函數。舉個簡單的例子,比如ACE_OS::sleep(1)在任何平台下都是休眠一秒,這樣就很方便寫出跨平台的代碼了。更好玩的是第三層,ACE把設計模式玩到了極致,設計出了許多實用的組件。比如任務和主動對象(Active Object),反應堆(Reactor),接受器(Acceptor)和連接器(Connector)。下面簡單講一下這三類模式的應用。
1. 任務和主動對象(Active Object)
那麼到底什麼是主動對象呢?傳統上,所有的對象都是被動的代碼段,對象中的代碼是在對它發出方法調用的線程中執行的。也就是,調用線程(calling threads)被「借出」,以執行被動對象的方法。
而主動對象卻不一樣。這些對象持有它們自己的線程(甚或多個線程),並將這個線程用於執行對它們的任何方法的調用。因而,如果你想像一個傳統對象,在裡面封裝了一個線程(或多個線程),你就得到了一個主動對象。
ACE中的主動對象的實現核心是ACE_Task。要實現一個主動對象,只需繼承自ACE_TASK。ACE_Task有幾個虛函數比較重要。open(), close()分別是對應服務初始化和關閉。可以在open()調用activate()來創建線程執行任務。而ACE_TASK中的所有主動線程的執行入口是虛函數svc()。只需在svc()中加入你的主動對象需要執行的任務代碼即可。
2. 反應堆(ACE_Reactor)
在設計模式教科書中這么描述反應堆模式:反應堆本質上提供一組更高級的編程抽象,簡化了事件驅動的分布式應用的設計和實現。除此而外,反應堆還將若干不同種類的事件的多路分離集成到易於使用的API中。特別地,反應堆對基於定時器的事件、信號事件、基於I/O埠監控的事件和用戶定義的通知進行統一地處理。
描述地比較抽象,簡單來講就是:
a.創建事件處理器,以處理感興趣的事件。比如handle_input()函數處理可能收到的輸入。
int CMyACETask::handle_input (ACE_HANDLE fd);
b.把事件處理器指針和感興趣的事件登記到反應堆,具體來說就是
m_reactor->register_handler(this, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK );
c.在用戶已登記的某個事件發生時,反應堆發出對處理器中相應方法的回調。
3. 接受器(Acceptor)和連接器(Connector)
ACE_Acceptor工廠允許應用開發者改變「助手」對象,以用於:
被動連接建立
連接建立後的處理
同樣地,ACE_Connector工廠允許應用開發者改變「助手」對象,以用於:
主動連接建立
連接建立後的處理
接受器和連接器的具體代碼比較簡單,請見索引文檔
② 如何用標准C++寫個聊天室程序
因為設計到消息的傳送,必須使用socket編程
我目前知道兩種方法 分別是winsock和ace_sock 就是windows的和ACE框架下
如果想實現聊天室不用MFC的話就需要自己手動生成界面 很難實現
下面分別給出windows和ace的關鍵代碼 可以參考一下
//-----------------------------------
// ACE 部分
//----------------------------------
ACE::init();
ACE_INET_Addr DestAddr(8090, "192.168.208.24");
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer ;
if(-1 == connector.connect(peer,DestAddr))
{
MessageBox("連接失敗!");
}
ssize_t SendSize = peer.send_n("hello world\n",11);
peer.close();
ACE::fini();
}
//-----------------------------------
// Winsock 部分
//----------------------------------
WSADATA wsaData ;
int SrcAddr;
int err = WSAStartup(MAKEWORD(2,1),&wsaData);
if (err != 0) return;
struct sockaddr_in DestAddr;
memset(&DestAddr , 0 , sizeof(DestAddr));
DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr("192.168.208.24");
DestAddr.sin_port = htons(8090);
SrcAddr = socket(AF_INET,SOCK_STREAM ,0);
int succ ;
if(connect(SrcAddr,(struct sockaddr *)&DestAddr,sizeof(DestAddr)) == 0)
{
succ = send(SrcAddr,"hello world",11,0);
}
shutdown(SrcAddr,2);
closesocket(SrcAddr);
WSACleanup();
}
我說的不夠明白么 可以但是就用你現在學的東西不行 譚浩強的書太基礎了
③ 網路編程用 c還是c++
網路的底層API都是C語言的,不管是Linux還是Windows都是這樣。用C++是為了封裝代碼,達到復用和擴展的目的。簡單的項目用C足夠了,C++適合開發復雜的大型項目。據說ACE的結構很復雜,不太適合學習,我反正是沒有接觸過,只用過 Berkeley Socket
④ 畫模型的ACE是什麼的縮寫是什麼軟體
Adaptive Communication Environment
C++ 網路編程庫套件
Adaptive Communication Environment(自適配通信環境),簡稱ACE。為一個以C++的Template技術所做成的開放源代碼的可跨平台的網路應用程序的程序庫套件。它提供了socket/threading/memory management等多種系統調用的面對對象的wrapper,使C++通信軟體開發更加簡單。
⑤ ACE是指什麼
哦,是被褥的牌子呀
⑥ 如何編譯,配置ACE
ACE是個很有用的開放源代碼的C++網路編程開發包,利用它比直接用API更有利於代碼的健壯性,可移植性,並相對簡單。
估計大家剛接觸ACE時,都有一定難度,說不定就半途放棄了,這是我學ACE兩天中的總結,基本上不成文,但我想研究到ACE的你一定會明白下文的意思。
一、ACE官方主頁: http://www.cs.wustl.e/~schmidt/ACE.html
下載地址: http://deuce.doc.wustl.e/Download.html
Building and Installing ACE:http://www.dre.vanderbilt.e/~schmidt/DOC_ROOT/ACE/ACE-INSTALL.html
我下載的是Latest Beta Kit中的ACE.zip(Latest Release中的壓縮包好像有問題,我有WinRAR3.30解壓縮報錯)
二、解壓縮後放在D盤
D:\ACE_wrappers
三、在D:\ACE_wrappers\ace目錄下新建文件config.h加入一行
#include "ace/config-win32.h"
四、編譯:用VC6.0打開D:\ACE_wrappers\ace\ace.dsw
左側顯示 ACE DLL classes
ACE LIB classes
或1、從菜單上選擇「編譯」,「放置可遠行配置」,選擇你需要的工程配置
「編譯」,「重建全部」(或任一,如ACE DLL - Win32 MFC Debug)
此過程可能持續半小時至一個小時不等
或2、從菜單上選擇「編譯」,「批構建」,選擇你需要的工程配置
此過程可能持續二至四個鍾頭
產生的.lib文件位於D:\ACE_wrappers\ace\下,
產生的.dll文件位於D:\ACE_wrappers\bin\下
同樣打開ace_static.dsw
編譯
ACEs.lib
ACEsd.lib
ACE_RMCasts.lib
ACE_RMCastsd.lib
TMCasts.lib
TMCastsd.lib
ACE生成的dll和lib文件的命名規則:(d = debug,s = static)
debug - aced.lib、debug+static - acesd.lib、release - ace.lib、 release+static - aces.lib
五、樣常式序的編譯
用VC打開D:\ACE_wrappers\tests\tests.dsw
「編譯」,「批構建」
六、自寫程序的工程配置
中篇:ACE程序員教程.pdf中的樣常式序:
網址:http://www.cs.wustl.e/~schmidt/ACE_wrappers/docs/tutorials/guide-tutorials.html
將網頁上的原代碼復制到一新建文件,並命名為server.cpp
用VC打開,編譯,重建全部,彈出對話框,「This build command require ...「,點」是「
會出現以下錯誤
如果有「Cannot open include file: 'ace/SOCK_Acceptor.h': No such file or directory」
工程-設置-C/C++: Preprocessor,附加包含路徑:D:/ACE_wrappers
如果有「 You must link against multi-threaded libraries when using ACE (check your project settings)」
工程-設置-C/C++: Code Generation - Use run-time library : Debug Multithreaded Dll
如果有「error C2065: 'ACE_ERROR' : undeclared identifier」
error C2065: 'ACE_DEBUG' : undeclared identifier
#include "ace/Log_Msg.h"
error C4716: 'ace_main_i' : must return a value
在main中加入
return 0;
「error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl」
工程-設置-Link-Input: 對象/庫模塊:添加aced.lib 附加庫路徑:D:\ACE_wrappers\ace
編譯client中遇到的問題
1、error C2039: 'sprintf' : is not a member of 'ACE_OS'
#include "ace/OS_NS_stdio.h"
2、error C2039: 'strlen' : is not a member of 'ACE_OS'
#include "ace/OS_NS_string.h"
3、error C2059: syntax error : '?'
錯誤在這一句: ACE_DEBUG((LM_DEBUG,?Usage egX <hostname> <port_number>\n?));
將?改為"
4、無法找到動態鏈接庫aced.dll於指定的路徑
為系統變數PATH加上D:\ACE_wrappers\bin
靜態包含:
工程-設置-C/C++-預處理程序定義中加入 ,ACE_AS_STATIC_LIBS
例1server編譯後生成
server.exe 16K serverd.exe 97K servers.exe 124K serversd.exe 669K
(servers.exe較適合發布)
例2 client編譯後生成
client.exe 16K clientd.exe 97K clients.exe 124K clientsd.exe 669K
(clients.exe較適合發布)
測試 clients 127.0.0.1 1919
servers 1919
下面是馬維達老師寫的:(轉自huihoo)
發表於: 3/31/2003 - 04:24
翻譯的一點小東西,希望能對大家有幫助。
其實也不敢稱為是翻譯的,水平太爛了,大家將就著看吧 :)
使用Microsoft Visual C++ 在win32平台上生成和安裝ACE:
注意:關於MSVC5.0和Service Pack 3的使用有一些問題,過去一些用戶在sp2中使用良好的代碼在sp3種卻會引發一些問題。感謝Bill 的細心查找,這一神秘的問題被解決了。答案?(哦,這兒有一個好答案。。。)這可能是因為有多個版本的sp3較早版本的sp3有一些bug,而後來的版本修正了這些錯誤,從微軟網站上下載的1998年6月16日版本的sp3是一個良好的版本。如果X03-50158是那些擁有sp3的光碟序列號的一部分,那麼這些版本也是良好的。但是不管任何版本的sp3,其STL的實現都有錯誤,詳細情況請瀏覽http://www.dinkumware.com/vc_fixes.html。感謝Ben Eng對這些錯誤的修正。
現在的SP4(希望只有一個版本)已經修正了STL中的死鎖問題。
我們現在將不再積極的支持MSVC 4.X以及以前的版本,ACE可和這些編譯器一起工作但是可能會丟失一些好處。
1. 將ACE分發包界壓縮到一個目錄中,這將在那個目錄中生成一個包含ACE的目錄ACE_wrappers。接下來的步驟中假設ACE分發包被解壓縮到ACE_ROOT=C:\ACE_wrappers中,因此ACE將會存在於ACE_ROOT\ace目錄中。
2. 在ACE_ROOT\ace目錄中創建一個文件,命名為config.h,其內容為:
#include "ace/config-win32.h"
3. 在VC++中載入ACE的工程文件(ACE_ROOT\ace\ace.dsw)
4. 每個工程都會包含多個配置,這些配置是Debug/Release, MFC/Non-MFCh和Static/Dynamic庫版本等選項的混合。確定你所需要的構造(例如,調試代碼需要ACE的調試版本)。所有這些不同的配置可以為你提供一些便利,你可以或者採用不同的模式以構造不同配置的應用,或者通過改變ace\config.h來改變在NT上的不同配置。
注意:如果你使用動態連接,請保證ACE_ROOT\bin被添加到你的path環境變數中,否則你將在運行程序的時候碰到尋找ace.dll或者aced.dll的問題。
5. 如果你在Windows NT或者Windows 2k上構建ACE,你可以馬上開始構造她而不需任何改變,如果你在Windows 9x/me上構建,那麼你必須在
ACE_ROOT\ace\config.h.的#include塊之前添加一行:
#define ACE_HAS_WINNT4 0
這將在ACE中移掉一些WinNT/Win2K中特有的代碼。
6. 如果你希望使用MSVC自帶的標准C++頭文件(C++ Standard Draft 2種定義的iostream,cstdio…..),則應該在
ACE_ROOT\ace\config.h.的#include塊之前添加一行:
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
7. 如果需要和MFC一起使用,增加如下定義到你的config.h文件中,注意,如果你想使用spawn一個新的線程,則必須保證使用THR_USE_AFX標志來spawn線程。
#define ACE_HAS_MFC 1
預設的,ACE工程使用MSVC運行時的動態DLL版本,你也可以選擇使用ACE的不關心運行時庫的靜態(LIB)版本。我們選擇僅與動態運行時庫連接的原因在於基本上所有的NT機器上都會安裝這些庫,而我們則可以因此而減小代碼的大小。如果你希望ACE與MFC的靜態版本連接,則可以在config.h中定義ACE_USES_STATIC_MFC。然而,如果你希望靜態的連接所有的庫(包括MSVC運行時庫),就需要自己修改工程文件了。
8. 如果要構建ACE的靜態版本,則需要在config.h中定義ACE_AS_STATIC_LIBS,此宏在那些希望使用ACE的靜態版本的應用工程中也必須定義。
作為一個可選項,你可以在
#include statement in ACE_ROOT\ace\config.h.之前添加一行:
#define ACE_NO_INLINE
來取消函數內聯從而減小靜態庫(和你的運行碼)的大小。
9. ACE DLL和LIB庫的命名規則:
我們使用如下的規則明明使用MSVC的ACE的DLL和LIB文件。
"Library/DLL name" + (是靜態庫嗎 ? "s" : "") + (包含調試信息 ? "d" : "") + {".dll"|".lib"}
在MSVC環境中使用ACE的更多信息可以在這里找到。
-----------------------------------------------------------------------
一、安裝TAO,需要先編譯並安裝ACE。
二、ACE的編譯和安裝步驟見http://www.cs.wustl.e/~schmidt/ACE_wrappers/ACE-INSTALL.html。TAO的編譯和安裝步驟見http://www.cs.wustl.e/~schmidt/ACE_wrappers/TAO/TAO-INSTALL.html。如果你英文程度還可以的話,最好直接閱讀這兩篇文檔。說到底,中文文檔只是「權宜之計」;漢語並不太適合進行邏輯性的表述。
但我還是把其中的一些段落編譯如下(VC 6.0 + ACE-5.2.1 + TAO-1.2.1):
ACE的編譯與安裝
一般規則
ACE中的許多特性可以通過在$ACE_ROOT/ace/config.h中定義一些宏來進行修改。這些宏應該總是在包括針對你的平台的配置文件之前出現。
但是,如果你想要取消/重定義在針對特定平台的配置文件中定義的宏,#undef應該在配置文件之後出現。
如果你計劃在多種平台上編譯ACE,你也許需要考慮克隆源碼樹。
步驟:
1. 將ACE發布文件解壓縮到某個目錄中,在其中將會創建含有所有文件的ACE_wrappers目錄。在下面的步驟中,ACE_wrappers目錄將以ACE_ROOT為名來指稱。
2. 在ACE_ROOT\ace目錄中創建一個名為config.h的文件,在其中包含:
#include 「ace/config-win32.h」
3. 現在載入ACE的項目文件(ACE_ROOT\ace\ace.dsw)。
4. 其中的每個項目都含有若干不同的配置(可混合Debug/Release、MFC/Non-MFC、Static/Dynamic library版本)。你可以從中選擇你所需的配置,或是使用ace/config.h來進行調整。
注意:如果你使用動態鏈接庫,在運行使用ACE的程序時,確定你在PATH中包括了ACE_ROOT\bin。
5. 如果你的系統平台是WinNT或2000,那麼無需任何改動你就可以開始編譯了。如果是Windows 9x/Me,你需要在ACE_ROOT\ace\config.h中的#include語句之前增加:
#define ACE_HAS_WINNT4 0
6. 如果你想要使用MSVC標准C++頭(iostream、cstdio……),在ACE_ROOT\ace\config.h中的#include語句之前增加:
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
7. 要與MFC一起使用ACE,再增加下面的定義:
#define ACE_HAS_MFC 1
注意如果你想要通過CWinThread派生新線程,一定要設置THR_USE_AFX。在預設情況下,所有的ACE項目都使用DLL版本的MSVC運行時庫。盡管如此,你仍然可以選擇使用static(LIB)版本的ACE庫。如果你想要將MFC作為靜態庫鏈接進ACE,你可以在config.h文件中定義ACE_USES_STATIC_MFC。但如果你想要靜態鏈接所有的東西(包括MSVC運行時庫),你就需要自己修改ACE的項目文件。
8. ACE的靜態版本是通過定義ACE_AS_STATIC_LIBS來編譯的。在鏈接靜態ACE庫的應用項目中也應該使用這個宏。
你也可以在config.h文件中增加
#define ACE_NO_INLINE
來取消函數內聯並減小靜態庫(和你的可執行程序)的大小。
9. ACE DLL和LIB的命名方案:
"Library/DLL名" + (是否為靜態庫 ? "s" : "") + (是否啟用了Debugging ? "d" : "") + {".dll"|".lib"}
10. 配置完畢後編譯即可。選擇dll版本,編譯生成的dll文件在ACE_ROOT\bin中,相應的lib文件在ACE_ROOT\ace中。
ACE測試
各測試程序在ACE_ROOT\tests中。在其中也有一個工作空間文件可用來編譯所有的測試程序(tests.dsw)。
一旦你編譯了所有測試程序(可使用批編譯),你可以運行tests目錄中的perl腳本run_test.pl或批處理文件run_tests.bat來進行所有測試。
TAO的編譯與安裝
確定VC的CL.EXE在你的訪問路徑上。設置ACE_ROOT或TAO_ROOT環境變數。例如:
set ACE_ROOT=C:\ACE_wrappers
TAO最好放置在ACE_wrappers(這也是預設情況)。
1.確定ACE已經編譯和安裝。
2.確定ACE_wrappers\bin已在「Tools|Options」中的「Executable Directories」中列出。如果在MSVC下使用TAO_IDL編譯器就需要進行此設置。
3.載入tao\TAO.dsw,並編譯TAO庫。
4.要編譯Cubit測試,載入performance-tests\Cubit\TAO\IDL_Cubit\IDL_Cubit.dsw,並編譯客戶和伺服器。
TAOACE.dsw
TAOACE.dsw是一個Visual C++ 5.0/6.0工作空間文件,它載入的項目包括ACE、TAO、TAO_IDL(編譯器)、gperf、orb服務庫,以及一些單獨的可執行程序(比如Naming Service,等等)。它可以用於編譯所有的用於編譯/運行TAO應用的文件。
三、我選擇編譯的是dll版本(Release),並在ACE的config.h文件中定義了「#define ACE_HAS_STANDARD_CPP_LIBRARY 1」。編譯後我所得到的ace.dll的大小是1.13MB,相應的ace.lib的大小是1.77MB;TAO.dll的大小是1.47MB,相應的TAO.lib的大小是2.74MB。所有文件約有 MB,包括源程序、編譯生成的中間文件,等等,但有些例子及服務我沒有編譯。
祝學有所成!
馬維達
-------------------------------------
將ACE與VC6集成在一起
一.打開 Tools>Options>Directories
加入以下內容:
Executable File:
C:\ACE_wrappers\bin
Include File:
C:\ACE_wrappers\
C:\ACE_wrappers\TAO
C:\ACE_wrappers\TAO\orbsvcs
Library Files:
C:\ACE_wrappers\ace
C:\ACE_wrappers\TAO\tao
C:\ACE_wrappers\TAO\orbsvcs\orbsvcs
Source Files:
C:\ACE_wrappers\ace
C:\ACE_wrappers\TAO\tao
C:\ACE_wrappers\TAO\orbsvcs\orbsvcs
二.加入 C:\ACE_wrappers\bin 到系統環境變數 path中
三.設置系統變數
ACE_ROOT=C:\ACE_wrappers
TAO_ROOT=C:\ACE_wrappers\TAO