zoukankan      html  css  js  c++  java
  • ACE 安装指南及示例

      
     

      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 <目录>

      进入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

    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

    下一步,我们在${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尝试编译,链接,运行吧。

  • 相关阅读:
    第五周任务以及结对编程
    “爆打”团队阿尔法发布 以及 第四周任务
    第三周内容
    爆打第一次站立会议
    3.23日PSP
    NABCD模型
    个人对结对编程的体会
    Fantacy团队第一次站立会议
    图形设想(简图)
    3月20日随笔
  • 原文地址:https://www.cnblogs.com/iapp/p/3631834.html
Copyright © 2011-2022 走看看