The ADAPTIVE Communication Environment (ACE)
是一套免费的、开源的面向对象框架,它为大规模并发通信软件实现了许多核心的设计模式。
ACE
提供了一套丰富的、可重用的
C++
封装类和框架组件,并且可以跨平台实现大多数常见的通信软件的功能。本文将通过几个非常简单,并且可以说是粗糙的小例子,为大家讲述
ACE
的安装及配置过程。通过这些简单的小例子,带领大家以最快的速度进入
ACE
的世界。我们第一步的目的就是不求完美,但求入门。
首先我要先介绍一下本文所使用的环境,以后本文所提到的所有细节都要和这个环境相匹配,如果大家在安装配置时遇到问题,也可以用
QQ(21807822)
或
Blog(http://dukejoe.yeah.net)
和我联系。我使用的是
AIX 5.3 Windows XP Home ACE 5.5 Visual Studio.NET 2003
如果环境不完全匹配,则安装过程会有少许的不同。
下载
ACE
的页面是
Obtaining ACE, TAO, and CIAO
,可能有的朋友还不太熟悉英文,那大家可以直接点击下面的链接下载
ACE-5.5.zip(windows
平台
) ACE-5.5.tar.gz(unix
平台
)
。如果时间太长,可能链接太长,最好还是学习一些简单的英文,直接从
ACE
的下载页面找当前版本下载。本文所写的时间
ACE
的最新
Release
是
5.5
我们先以
Windows
平台为例说明。用
WinZip
解压
ACE-5.5.zip
,硬盘最好保留
2G
以上的空间。我保留的是
8
个
G
(毕竟还要干别的嘛),解压后的目录类似
d:/ace <
目录
>
-- ACE_wrappers < 目录 >
-- ace < 目录 >
-- include < 目录 >
-- lib < 目录 >
-- ACE_wrappers < 目录 >
-- ace < 目录 >
-- include < 目录 >
-- lib < 目录 >
进入
D:/ACE/ACE_wrappers/ace
目录,新建一个
config.h
文件。加入一句话
#include "config-win32.h"
,现在使用
Visual Studio.NET 2003
打开
D:/ACE/ACE_wrappers
下的
ace.sln
,打开解决方案后,可以像你做其它开发一样,选择重新生成解决方案,接下来我们就不必再做任何操作。经过漫长的等待最后我们会在
lib
目录下生成
ace
所需要使用的
lib,dll
等文件。至此在
Windows
上
Build ACE
的过程就基本结束了。
第二步我们把
D:/ACE/ACE_wrappers/lib
目录加到
path
里,这样使用
ace
开发的程序就可以运行了。
下一步我们要配置
VC
。打开
Visual Studio .NET 2003
工具
-->
选项
-->
项目
--> VC++
目录,在
“
包含目录
”
中添加
D:/ACE/ACE_wrappers
,在
“
库文件
”
中添加
D:/ACE/ACE_wrappers/lib
,在
“
源文件
”
中添加
D:/ACE/ACE_wrappers/ace
。这样我们就完成了
VC
的配置。在程序中要使用头文件时,就会在
D:/ACE/ACE_wrappers/ace
目录下查找,而生成的
dll,lib
文件,如
ACEd.lib
,可以在
D:/ACE/ACE_wrappers/lib
中找到(如果找不到,说明你没有编译
)
。下面我们来看一个例子,服务端和客户端都是在
aix
和
windows
上测试通过,都可以运行在这两套系统上。首先启动服务端,打开侦听,客户端连接后随意发点消息过去,服务端也同时向客户端发送服务端所在主机的时间。这两个小程序非常简单,也还有很多的不足,但我们通过这个小程序是希望读者能对
ACE
的初步使用有一个感性的认识,并可以根据源代码中提到的一些类做为线索,展开
ACE
的学习。注意如果程序是在
Windows
下使用,需要在工程属性里的
“
链接
”
中加入
ACEd.lib
库,以便链接到
ACE
库。
如果是在
aix
上使用,可以生成一个
setenv.sh
,然后加入
ACE_ROOT=/rpt/gaohw/ACE_wrappers;export ACE_ROOT
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${ACE_ROOT}/build/ace/.libs/;export LD_LIBRARY_PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${ACE_ROOT}/build/ace/.libs/;export LD_LIBRARY_PATH
ACE_ROOT
的目录,你应该根据自已的系统进行修改。
aix
下使用的
makefile
文件内容如下:
all: test1
test1:test1.o
xlC_r -o test1 test1.o -L${ACE_ROOT}/build/ace/.libs/ -lACE
test1.o:test1.cpp
xlC_r -c -o test1.o -I${ACE_ROOT} test1.cpp
clean: rm -f test1 *.o |
/******************************************************************************
* * 一个简单的 ACE 客户端例程 * 功能:连接指定的 IP ,发送任意的一条消息,来触发服务端,然后接收数据并显示 * 作者:高宏伟 (DukeJoe) * 时间: 2007-07-18 14:19 * Blog : http://dukejoe.yeah.net * QQ : 21807822 * 开发平台:支持 AIX 5.3 和 Windows XP Home Edition *****************************************************************************/ #include "ace/INET_Addr.h" #include "ace/SOCK_Connector.h" #include "ace/SOCK_Stream.h" #include "ace/Log_Msg.h"
// FUZZ: disable check_for_streams_include
#include "ace/streams.h"
#if defined (ACE_WIN32) && (!defined (ACE_HAS_STANDARD_CPP_LIBRARY) || /
(ACE_HAS_STANDARD_CPP_LIBRARY == 0) || / defined (ACE_USES_OLD_IOSTREAMS)) # include <stdio.h> #else # include <string> #endif
int main(int argc, char* argv[])
{ ACE_INET_Addr iaServer; u_short nPort = 5001 ; const char * pServerHost = "10.110.16.45" ; int iResult ; ACE_SOCK_Connector scConnector; ACE_SOCK_Stream ssStream ; char szBuffer[1024] ; char* pText = " 高宏伟 QQ:21807822" ; size_t nLength = 0 ;
iResult = iaServer.set(nPort, pServerHost);
if (iResult == -1) ACE_ERROR_RETURN ((LM_ERROR, "lookup %s, %p/n", pServerHost, nPort), 1);
if ( scConnector.connect(ssStream, iaServer) < 0 )
ACE_ERROR_RETURN ((LM_ERROR, "%p/n", "connect()"), 1);
strcpy(szBuffer, pText) ;
ssStream.send_n(szBuffer, strlen(pText)) ; memset(szBuffer, 0, sizeof(szBuffer)) ; iResult = ssStream.recv_n(szBuffer, 1024) ; nLength = strlen(szBuffer) ; ACE::write_n(ACE_STDOUT, "Recv --> " , 9) ; ACE::write_n(ACE_STDOUT, szBuffer, nLength) ; ACE::write_n(ACE_STDOUT, "/n", 1) ;
return 0 ; } |
/******************************************************************************
* * 一个简单的 ACE 服务端例程 * 功能:当客户端发送任意消息过来之后,服务端向客户端发送当前主机的日期字符串 * 作者:高宏伟 (DukeJoe) * 时间: 2007-07-18 14:53 * Blog : http://dukejoe.yeah.net * QQ : 21807822 * 开发平台:支持 AIX 5.3 和 Windows XP Home Edition *****************************************************************************/#include <ace/OS_main.h> #include <ace/ACE.h> #include <ace/Log_Msg.h> #include <ace/SOCK_Acceptor.h> #include <ctime>
#include "ace/streams.h"
int DisplayTime(char* pTime) ;
int main(int argc, char *argv[])
{ ACE_INET_Addr addr(5001); ACE_SOCK_Acceptor server; ACE_SOCK_Stream stream; char szBuffer[1024] ;
if(server.open(addr)==-1)
{ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) %p/n"), ACE_TEXT ("bind failed"))); return 1; }
while(server.accept(stream)!=-1)
{ ACE_INET_Addr raddr; stream.get_remote_addr(raddr); ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("(%P|%t) connect:%s %d/n"),raddr.get_host_addr(),raddr.get_port_number()));
memset(szBuffer, 0, sizeof(szBuffer)) ;
DisplayTime(szBuffer) ; stream.send_n(szBuffer,sizeof(szBuffer)); stream.close(); }
server.close();
return 0;
}
int DisplayTime(char* pTime)
{ time_t nTime=0; time( &nTime ) ; tm *tm1 = localtime( &nTime ) ; sprintf(pTime,"%04d-%02d-%02d %02d:%02d:%02d",tm1->tm_year+1900,tm1->tm_mon+1,tm1->tm_mday,tm1->tm_hour,tm1->tm_min,tm1->tm_sec);
ACE::write_n(ACE_STDOUT, "
当前时间
--> " , 13) ; ACE::write_n(ACE_STDOUT, pTime, strlen(pTime)) ; ACE::write_n(ACE_STDOUT, "/n", 1) ; return 0 ; } |
在
Unix
上的安装配置我们是以
AIX 5.3
为例进行说明的。由于我使用的系统没有安装
openssl
库,所以我先下载了
openssl-0.9.8e.tar.gz
下载页面是
http://www.openssl.org
下载安装
openssl
比较简单
make
一下,再
make install
一下就可以了,在使用
ACE
之前,大家应该熟悉
unix
吧?(什么?不熟悉?
ACE
是个比较高级的主题,如果是小学没读完就上高中了,那初中和小学的课你还要好好补一下哟)
在
aix
上安装,要先设置
ACE_ROOT
,方法在上面的
setenv.sh
里有语句。
第二步也和
windows
一样要生成
config.h
。我们使用的是
aix 5.3
,所以我是要在
config.h
里包含
config-aix-5.x.h
文件即可
第三步进入
${ACE_ROOT}/include/makeinclude
目录,创建一个名为
platform_macros.GNU
的文件,在其中包含如下一行
include $(ACE_ROOT)/include/makeinclude/platform_aix.GNU ,另外还有一个方法是用 ln -s platform_aix.GNU platform_macros.GNU
include $(ACE_ROOT)/include/makeinclude/platform_aix.GNU ,另外还有一个方法是用 ln -s platform_aix.GNU platform_macros.GNU
下一步,我们在
${ACE_ROOT}
目录里新建一个目录
build
。然后
cd build
。在
build
目录里执行
../configure
,等待一段时间之后,我们再
make
一下就可以生成
ACE
了
在
AIX
上的安装过程就到这里了,下一步,你可以用上面的
setenv.sh
来初始化环境变量,其实也就是指定
ACE_ROOT
和
LD_LIBRARY_PATH
两个目录。
1
、设置
ACE_ROOT
变量。例如:
ACE_ROOT=/rpt/gaohw/ACE_wrappers;export ACE_ROOT
2
、在
${ACE_ROOT}/ace
目录里,新建
config.h
,加入
#include "config-aix-5.x.h"
语句。
或者不愿意生成文件就用 ln -s config-aix-5.x.h config.h
3
、在
${ACE_ROOT}/include/makeinclude
目录,新建
platform_macros.GNU
,加入
include $(ACE_ROOT)/include/makeinclude/platform_aix.GNU
当然你也可以用 ln -s platform_aix.GNU platform_macros.GNU 来做到相同的效果
4
、在
${ACE_ROOT}
里新建一个目录
build
5
、在
build
里敲
../configure
(注意,要有两个点)
6
、
configure
成功之后,再
make
,就大功告成。
7
、测试,按上文说法设置
LD_LIBRARY_PATH
,再用上面的源代码和
makefile
尝试编译,链接,运行吧。
|