问题:
最近一直在忙软工老师布置的最后一次作业:作业的内容是在ACE框架下的FTP下载程序。从开始从清楚ACE到底是怎么回事?到配置ACE,还有编写简单的ACE网络通信程序,总算学到了点东西。就总结一下。
解答:
1:什么是ACE
ACE全名为:"Adaptive Communication Environment",是一个美国人用C++编写的,可移植的面向对象主机基础设施中间件,我的理解是:ACE是一种封装的Socket通信包,里面包含了诸多的设计模式和框架,同时是跨平台的,屏蔽的很多的细节。从层次上应该是比较高级的网络编程模式,就是老师所说的“组装轮子”而不是“造轮子”.
2:如何在VC6.0中构建和配置ACE
(1)将ACE-5.5.zip解压到所需的安装目录,此处以E:/为例,解压后形成ACE_wrappers文件夹,因此ACE将会存在于ACE_wrappers/ace目录中。
ACE_wrappers的子目录中大致包含7个目录:分别为:
o ace 包含ACE工具包的源码
o bin含有许多有用的实用程序
o apps 包含许多基于ACE的应用程序,比如Gateway消息路由
o docs 含有与ACE的各个方面的有关信息,比如它的编码指导方针
o examples 包含很多例子,演示怎么使用ACE类和框架
o tests含有ACE的回归测试套件
(2)在系统中新建ACE_ROOT环境变量,值设为 E:/ACE_wrappers。具体设置为:
我的电脑->属性->高级->环境变量->新建
(3) 在E:/ACE_wrappers/ace目录中创建一个头文件,命名为config.h,其内容为:
#include "ace/config-win32.h"(必选项)
#define ACE_HAS_STANDARD_CPP_LIBRARY 1 (MSVC自带的标准C++头文件)
#define ACE_HAS_MFC 1(与MFC一起使用)
(4) 在VC++中加载ACE的工程文件(ACE_ROOT /ace/ace.dsw),在release和debug两种编译方式下进行编译,得到相应的库文件(ACE.dll、ACE.lib 和 ACEd.dll、ACEd.lib),其中ACE.dll 、ACE.lib是由release版生成的,ACEd.dll、ACEd.lib是由debug版生成的。具体操作方法:运行VC++,选择Build ->Batch Build…,将ACE-Win32 Debug和ACE-Win32 Release全部选中,Rebuild All即可.
(5)配置ACE环境。 打开VC++6.0,选择Tools->Options->Directories 加入以下内容:
1) Executable File:E:/ACE_wrappers/bin
2) Include File:E:/ACE_wrappers
3) Library Files:E:/ACE_wrappers/lib
4) Source Files:E:/ACE_wrappers
在编写程序时要在Project->Settings菜单中进行如下设置:
C/C++选项卡:
Code Generation:选择多线程版运行时库(Multithreaded DLL)。
Preprocessor:在“Additional include directories”域中加入$ACE_ROOT。
Link选项卡:
Input:在“Object/library modules”域中包含适当的ACE库文件,
这个地方也可以换成一条预编译指令即:#pragma comment(lib, "ace.lib") //这个是Release版本的请注意。
在“Additional library path”域中包含ACE库链接文件的路径。这通常是ACE_ROOT/ace。
(6). 在系统环境的变量 path中加入E:/ACE_wrappers/bin,否则在运行程序的时候碰到寻找ace.dll或者aced.dll的问题。
(7.) 在windows下release时有可能报错,错误如下:
error C2039: 'TryEnterCriticalSection' : is not a member of '`global
error C2065: 'TryEnterCriticalSection' : undeclared identifier
解决办法:
工程 Project-->setting-->C/C++ 写入:_WIN32_WINNT=0x0500
也可以在stdafx.h中写入:
#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x500
#endif
3:初学ACE的一些心得:
初次学习ACE,可以说基本上不知道怎么回事。基本上参照一起写的Socket通信的简单例子,然后对比ACE里面封装的类,来一一比较,发现ACE封装的确实非常的完善,和简洁。
因为我用的是非常简单的TCP/IP的Socket通信,所以写的非常的浅显:进行TCP/IP编程,ACE的Socket包装类族:
o ACE_SOCK_Connector 连接器,主动连接器,用于客户端
o ACE_SOCK_Acceptor :接受器,被动建立连接,用户服务器
o ACE_SOCK_Stream: 用于传输数据
o ACE_INET_Addr :定义对端点进行寻址的手段,其实就是Sock_Addr,地址族
然后我用ACE进行了一个简单的客户机和服务器的模拟,尝试了一下ACE编程。
4:展望:
感觉ACE的框架的使用我还没有用过,以后应该多尝试,尤其是Reactor框架,这个应该是比较简单和易用的,还有一些线程的同步和互斥。