原文出自http://www.cnblogs.com/binchen-china,禁止转载。

ACE源码约10万行,是c++中非常大的一个网络编程代码库,包含了网络编程的边边角角。在实际使用时,并不是所有代码都能用到你的项目中来,相反你只需要其中的一小部分就已经可以完成实际所需。

最近研究其源码最大的感受就是代码量大,资料少,逻辑跳跃大。网上搜了下ACE方面的书籍和资料,也是皮毛上打滚,概念满天飞,侧重讲解如何使用其框架,复杂的底层代码和实现都避而不谈,不如直接看源码来的直接。ACE代码目录结构并不是非常好,很多文件堆在一个路径下面,很阅读难归纳各个文件的功能,源码大量使用模板和导入导出,source insight看的实在汗颜。

ACE代码可以分三个层次:OS层、OO层和框架层:

  • OS层主要是为了兼容各个平台,将网络底层API统一化,这一层用户往往不用关心。
  • OO层则是对一些常用的数据结构或方法进行OO封装,方便上层使用,包括socket方法,进程、线程和他们的同步机制等。
  • 框架层实现了一些优秀的网络框架,直接拿来用就好了。

OO层经常用到的就是Socket封装,这部分内容主要包括以下几个:

  • ACE_SOCK_Connector:连接器,主动建立连接,用于Socket Client。
  • ACE_SOCK_Acceptor:接受器,被动建立连接,用于Socket Server。
  • ACE_SOCK_Stream:传输数据的流,用于传输数据。
  • ACE_INET_Addr:用于表示通信端点的地址。

封装这四个结构简化了Socket编程代码,避免了代码细节上错误,也增强了移植性和面向对象思想的应用。

之前文章的服务器编程可以看做是纯C语言的面向过程编程,从bind到listen等,非常繁琐且参数复杂,调用易出错,异常处理容易遗漏等,ACE的这四个Socket封装把这些问题都解决了。所有细节代码都在ACE内部屏蔽了。

下面直接上服务器代码:

 #include <ace/INET_Addr.h>
#include <ace/SOCK_Acceptor.h>
#include <ace/SOCK_Stream.h>
#include <ace/Log_Msg.h> #define MAX_BUFF_SIZE 1024
#define LISTEN_PORT 5010
#define SERVER_IP ACE_LOCALHOST class Server
{
public:
Server(int port,char* ip);
~Server();
bool open();
bool run();
void close();
ACE_SOCK_Stream& Getstream(){return Svr_stream;}
private:
ACE_INET_Addr Svr_addr,Cli_addr;
ACE_SOCK_Acceptor Svr_aceept;
ACE_SOCK_Stream Svr_stream;
}; Server::Server(int port,char* ip):Svr_addr(port,ip)
{ } Server::~Server()
{ } bool Server::open()
{
if (- == Svr_aceept.open(Svr_addr,))
{
ACE_DEBUG((LM_ERROR,ACE_TEXT("failed to accept\n")));
Svr_aceept.close();
return false;
}
return true;
} bool Server::run()
{
if (- == Svr_aceept.accept(Svr_stream,&Cli_addr))
{
ACE_DEBUG((LM_ERROR,ACE_TEXT("failed to accept\n")));
Svr_aceept.close();
return false;
}
return true;
} void Server::close()
{
Svr_aceept.close();
} int main()
{
Server Svr(LISTEN_PORT,(char*)SERVER_IP);
char strBuffer[MAX_BUFF_SIZE]; if (!Svr.open())
{
return ;
}
ACE_DEBUG((LM_INFO, ACE_TEXT("open success!\n"))); if (!Svr.run())
{
return ;
}
ACE_DEBUG((LM_INFO, ACE_TEXT("run success!\n"))); ACE_SOCK_Stream Svr_data = Svr.Getstream(); while()
{
int byte = Svr_data.recv(strBuffer,MAX_BUFF_SIZE);
if (- == byte)
{
ACE_DEBUG((LM_INFO, ACE_TEXT("receive data failed\n")));
break;
}
else if( == byte)
{
ACE_DEBUG((LM_INFO, ACE_TEXT("client closed!\n")));
break;
}
else
{
ACE_DEBUG((LM_INFO, ACE_TEXT("receive from client: %s\n"),strBuffer));
ACE_OS::memset(strBuffer, , sizeof(strBuffer));
}
}
Svr_data.close();
Svr.close();
return ;
}

运行结果:

至此,还并没有发现ACE完成的Server和之前用linux底层API完成的代码或功能上有何区别。这里还暂时只是单纯的利用OO层代码熟悉ACE,后续将利用ACE的Reactor框架进行Server开发。感受ACE的优势和便捷。

ACE - 代码层次及Socket封装的更多相关文章

  1. C# .NET Socket封装

    Socket封装,支持多客户端,支持大文件传输,支持多线程并发,对较大的Socket包进行分块传输. 封装所要达到的效果,是可以像下面这样使用Socket和服务端通信,调用服务端的方法,让你在使用So ...

  2. 跨平台的游戏客户端Socket封装,调整

    原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...

  3. Linux C socket 封装

    /************************************************************************** * Linux C socket 封装 * 声明 ...

  4. 从函数到包的Python代码层次

    代码层次 Python是一门脚本语言,新建一个.py文件,写点代码,就可以跑起来了,无论放哪都可以.比如where.py文件: print("Where am I?") 那么问题来 ...

  5. 一个高性能异步socket封装库的实现思路 (c#)

    前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...

  6. 转:深入浅出UML类图(具体到代码层次)

    深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN   在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...

  7. ACE代码编辑器,代码提示,添加自定义数据

    //设置自动提示代码 var setCompleteData = function(data) { var langTools = ace.require("ace/ext/language ...

  8. web前端socket封装库--giraffe

    摘要: 最近在做前端的socket消息推送,使用了socket.io.js的最新版本.使用过的都知道socket.io.js是基于消息类型来通信的,如果消息类型多了就很难维护.所以本人就对socket ...

  9. [改善Java代码] 提倡异常的封装

    JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性   ...

随机推荐

  1. hdu----(4301)Divide Chocolate(状态打表)

    多校综合排名前25名的学校请发送邮件到HDUACM@QQ.COM,告知转账信息(支付宝或者卡号) Divide Chocolate Time Limit: 2000/1000 MS (Java/Oth ...

  2. C语言中static变量详解

    Static翻译出来是“静态”“静止”的意思,在C语言中的意思其实和它的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数.经static修饰过后的变量或者函数的作用域或者存储域会发生变化 ...

  3. Nginx+Php-fpm+MySQL+Redis源代码编译安装指南

    说明:本教程主要包括以下三个部分: 1. 源代码编译安装Nginx 2. 源代码编译安装php以及mysql.redis扩展模块 3. 配置虚拟主机 文中所涉及安装包程序均提供下载链接,欢迎使用 运行 ...

  4. Objective-C:Foundation框架-概述

    iOS的整体架构(以iOS8为例)图如下: 从Cocoa Touch到Core OS下面四层包含了开发iOS应用程序所用到的所有API(第三方框架也是基于这几个层的).每个层又都包含了许多框架.框架就 ...

  5. JFrame面板

    1.可见性与透明性 可见性:当面板不可见时,则该面板中包含的组件会无法显示. 透明性:若该面板是可见且透明的,那么只是面板会透明(比如面板的背景色无法看到),面板上的组件仍会显示. 注:可见性通过se ...

  6. HTTP脚本化——XMLHttpRequest对象的学习笔记

    一. HTTP 请求和响应 一个HTTP请求由4部分组成 HTTP请求方法(也叫动作Verb) 正在请求的URL 一个可选的请求头集合(可能包含身份验证信息等) 一个可选的请求主体 服务器返回的HTT ...

  7. [整理]Svn常见问题汇总。

    1.’.’ is not a working copy.Can’t open file‘.svn/entries’: 系统找不到指定的路径. 解答:原因是输入的访问路径不正确,如svn://192.1 ...

  8. CentOS查看软件源提供的软件版本命令

    yum list available第二列包更详细的说明:yum info packagename

  9. useradd/du/df/passwd/usermod命令

    一.useradd命令 useradd命令-M -u -s -g 常用 -c:加上备注文字,备注文字保存在passwd的备注栏中.  -d:指定用户登入时的启始目录. -D:变更预设值.(修改默认配置 ...

  10. POJ 2255 Tree Recovery 树的遍历,分治 难度:0

    http://poj.org/problem?id=2255 #include<cstdio> #include <cstring> using namespace std; ...