现在的位置: 首页 > 综合 > 正文

实战ACE

2013年10月17日 ⁄ 综合 ⁄ 共 1675字 ⁄ 字号 评论关闭

1,下载哪个版本

我在最开始选择了最新版本5.6,后来才发现:并不是越新越好。本来我只是对网络编程进行学习和尝试,但是ace5.6的库文件需要vs2005才能够编译(.sln文件打开项目)。

所以,我还是选择了ace5.4版本,可以用vc6编译运行:)至于下载的地址嘛,直接上网搜索,或者在官网上翻找——我比较倾向于前者:http://download.dre.vanderbilt.edu/previous_versions/ 而且官网的链接可能发生改变。

2,编译链接、环境设置

下载源文件后的事情,可以按照:http://blog.csdn.net/yubo198/archive/2008/01/30/2072826.aspx 这篇文章进行。

不过值得注意的是:我编译生成的dll文件,是在$(ace_root)/bin目录下,而lib文件,则是在$(ace_root)/ace 目录下,而不是像上文所说的,在$(ace_root)/lib 目录下。不过没有关系,将lib文件拷贝到lib目录下、在系统环境变量path中,添加bin目录即可。

include目录设置(在vc中设置,让编译器能找到头文件)、lib文件设置(在vc中设置)、dll运行库的设置(运行时需要加载,所以要放到path环境变量中),这三个方面搞清楚了,也就差不多了。

3,编写第一个程序

ACE网络程序入口点可不止一个呢!在$(ace_root)/tests目录下,双击test.dsw,可以运行所有示例程序。它们很多使用run_main作为函数入口点函数。你可以尝试编译运行一下这里的程序,满足一下自己的快感:)

需要自己动手编写一个程序了,我简单地写一个:

  1. #include "ace/SOCK_Stream.h"
  2. #include "ace/SOCK_Connector.h"
  3. #include "ace/INET_Addr.h"
  4. int main(int argc, char** argv)
  5. {
  6.     const char* pPathName = "index.html";
  7.     const char* pServerHostName = "ace.ece.uci.edu";
  8.     
  9.     ACE_SOCK_Connector connector;
  10.     ACE_SOCK_Stream    peer;
  11.     ACE_INET_Addr      peerAddr;
  12.     if (peerAddr.set(80,pServerHostName) == -1)
  13.     {
  14.         return 1;
  15.     }
  16.     else if (connector.connect(peer, peerAddr) == -1)
  17.     {
  18.         return 1;
  19.     }
  20.     return 0;
  21. }

然后编译运行——居然出错?而且是link出错?

仍旧是动态链接库的问题:要么,在project setting->link里面,老老实实地添加:aced.lib[1],要么使用预编译宏:

  1. #ifdef      _DEBUG
  2. #pragma     comment(lib,"ACEd.lib")
  3. #else
  4. #pragma     comment(lib,"ACE.lib")
  5. #endif

另外,注意main函数中需要包含参数:int argc, char** argv,否则也会莫名其妙地link出错(提示main函数出错)。

此外,到网上找到一篇代码编写的帖子:

http://www.yuanma.org/data/2006/0808/article_1331.htm 从ACE源代码看Socket编程,夸赞ace代码优秀的blog

 

That's all ......Good luck!

[1] 这里还有一个小插曲,我在添加lib文件的时候,由于是多工程,结果不小心将lib文件加入了错误的工程——汗,结果当然还是link出错啦!我就很纳闷了:明明pragma宏可以起作用,在link选项中添加啊就不行?

抱歉!评论已关闭.