Linux+ACE 网络编程系列 1 环境布置

c/c++在liunx网络环境下的应用程序开发是一个复杂的问题,在这个开源环境内学习网络编程对于强化程序员的网络构架知识很有帮助。

这么大的题目,里面的文章当然不会少,这里从c/c++上的一个著名的网络开发框架ACE开始,逐个题目展开,和各位好友一起了解网络高性能程序的重要知识。


ACE在百度查一查,词目解释是:

ACE自适配通信环境(ADAPTIVE Communication Environment)是可自由使用、开放源码的 面向对象(OO)框架(framework),它实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可重用C++ 包装外观(wrapper facade)和框架组件,可跨多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享 内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步等等。
ACE的目标用户是高性能和实时通信服务和应用的开发者。它简化了使用进程间通信、事件多路分离、显式动态链接和并发的OO网络应用和 服务的开发。此外,通过 服务在运行时与应用的动态链接,ACE使系统的配置和重配置得以自动化。
ACE正在进行持续的改进。Riverace公司采用开放源码商业模式对ACE进行商业支持。此外,ACE开发组的许多成员正在进行The ACE ORB(TAO)的开发工作。

ACE的官网主页是 http://www.cs.wustl.edu/~schmidt/ACE.html,下载地址是 http://download.dre.vanderbilt.edu/
如果是用源码编译的方式来安装ACE的话,建议下载FULL版本,only source版本很坑爹,至少在LIUNX下工作时,FULL版本编译会简单点。
在windows下事情还是比较简单的,微软大大把大家服务的很好了,照着官网的步骤1,2,3,4就行了。
但在Liunx下,则会相对复杂些,方法如下
手动建config.h platform_macros.GNU文件的方式. 按如下步骤操作.
#tar -xzvf ACE-x.x.x.tar.gz // 解压ACE的tar包. linux不应该是一个zip包.
#mv ACE_wrappers /usr/local // 使解压出来的文件夹ACE_wrappers在/usr/local下面
                                                      // 当然,也可以move到其它地方.
#export ACE_ROOT=/usr/local/ACE_wrappers // 临时有效. bash关闭后得重新输入.
// ACE_ROOT环境变量. 编译时必需.
// /usr/local/目录可以是其它. 这依赖于你上一步的操作.
// 保持一致即可.
#cd $ACE_ROOT/ace // 进到$ACE_ROOT/ace目录.
#vi config.h // 这是一个新文件.
在其中添入: #include "ace/config-linux.h" // 记得敲个回车.保存退出.
#cd $ACE_ROOT/include/makeinclude // 准备创建platform_macros.GNU文件
#vi platform_macros.GNU // 这是一个新文件.
在其中添入: include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU
// 保存退出
另外,如果不但想要编译ACE,还想要安装,makeinstall, 那就不要费劲去找configure文件,直接在这个platform_linux.GNU里添加一句:
INSTALL_PREFIX = /usr/local #具体路径可以调整
接下来只要在wrappers,就是解压的根目录下运行make即可,不过那样会make出来很多东西,如果只想make动态链接库可以用下面的办法:

#cd $ACE_ROOT/ace // 再次回到$ACE_ROOT/ace目录.
#make // 编译开始
至make完成后, 在 #ACE_ROOT/ace目录下会生成两个文件 libACE.so libACE.so.x.x
libACE.so是一个link, 指向实际的动态链接库. libACE.so.x.x

然后到$ACE_ROOT/ace目录下,就是刚才make的地方,继续,make install

好的,以上是ACE的安装过程,接下来我来演示一下在Linux的QT5上学习、使用ACE。
本文这里先演示一小段通讯代码
在qt里新建一个项目
名叫Server吧,然后打开pro文件,添加下面两段代码
LIBS += -L/home/gxx/Codes/ACE/lib -lACE
INCLUDEPATH += /home/gxx/Codes/ACE/include

这两行命令可以确保编译器正确编译链接ACE库函数

在Server的cpp文件,首先要正确添加引用ACE的头文件

#include "ace/ACE.h"
#include "ace/Log_Msg.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Acceptor.h"

接下来是主要的main函数了
main(int argc, char* argv[])
{
        char buf[100];         
        ACE::init(); //调用ACE的静态方法,初始化ACE
        ACE_INET_Addr PeerAddr; //该类主要封装了C SOCKET 的地址对象,通过外观封装的模式,把struct sockaddr_in封装在内。方便用户的操作。
        if (PeerAddr.set(5050)==-1)  //设定端口
            return 1;
        
        ACE_SOCK_Acceptor  PeerAcceptor;  //用于被动连接的建立,基于BSD accept()和listen()调用,对应的是客户端的ACE_SOCK_Connect PeerConnect
        ACE_SOCK_Stream PeerStream;// 数据流,是ACE中Accepotr与Connect交互信息的中间介质
        if (PeerAcceptor.open(PeerAddr,1) == -1)
           throw "Address is error!";
        if (PeerAcceptor.accept(PeerStream)==-1) //设定数据流与TCPIP监视者之间链接
           return 1;     
        PeerStream.disable(ACE_NONBLOCK);  //设定阻塞或者非阻塞模式 , 阻塞模式下recv函数会持续等待直到获取指定数量的数据,非阻塞模式立刻返回结果
        PeerStream.recv(buf,100);  //获取100字节的信息,
        cout << buf << endl;
        PeerStream.send("Get Msg",10);
        PeerStream.close();
        ACE::fini(); 
}
        
 与Server端对应的是client端的connector,代码类似与Server端,需要注意的是,客户端connector需要指明服务端ip 
 
//client.cpp
main()
{
    ACE::init();
    ACE_SOCK_Connector PeerConnector;
    ACE_INET_Addr PeerAddr(5050,"127.0.0.1");//127.0.0.1表示本机通信,这个和Server端的Address设置略有不同,因为这里的ip表示对方ip,而Accptor
                                             //是负责搜索本机端口的,所以没必要设置位搜索其他ip   
    ACE_SOCK_Stream PeerStream;
    if (PeerConnector.connect(PeerStream,PeerAddr)==-1)
       exit(0);
    PeerStream.send("I am client",11);//链接成功后客户端会发送一小端信息,之后就关闭链接了。

    PeerStream.close();
    ACE::fini();
}
 

好了,这样一个简单的ACE 局域网信息交流两端Demo程序就算完成了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值