ACE - 代码层次及Socket封装
原文出自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封装的更多相关文章
- C# .NET Socket封装
Socket封装,支持多客户端,支持大文件传输,支持多线程并发,对较大的Socket包进行分块传输. 封装所要达到的效果,是可以像下面这样使用Socket和服务端通信,调用服务端的方法,让你在使用So ...
- 跨平台的游戏客户端Socket封装,调整
原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...
- Linux C socket 封装
/************************************************************************** * Linux C socket 封装 * 声明 ...
- 从函数到包的Python代码层次
代码层次 Python是一门脚本语言,新建一个.py文件,写点代码,就可以跑起来了,无论放哪都可以.比如where.py文件: print("Where am I?") 那么问题来 ...
- 一个高性能异步socket封装库的实现思路 (c#)
前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...
- 转:深入浅出UML类图(具体到代码层次)
深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...
- ACE代码编辑器,代码提示,添加自定义数据
//设置自动提示代码 var setCompleteData = function(data) { var langTools = ace.require("ace/ext/language ...
- web前端socket封装库--giraffe
摘要: 最近在做前端的socket消息推送,使用了socket.io.js的最新版本.使用过的都知道socket.io.js是基于消息类型来通信的,如果消息类型多了就很难维护.所以本人就对socket ...
- [改善Java代码] 提倡异常的封装
JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性 ...
随机推荐
- 使用自定义模板为Myeclipse添加新建Filter的功能
第一步:单击windowpreference菜单项,在打开的窗口中,依次展开Java.Editor.Templates列表项,然后在打开的Templates面板中,单击[New]按钮 使用这个模板非 ...
- 为大家分享一个 Ajax Loading —— spin.js(转)
原文地址:http://www.cnblogs.com/lxblog/p/3425599.html 我们在做Ajax 异步请求的时候,一般都会利用一个动态的 Gif 小图片来制作一个Ajax Load ...
- Java中Array的常用方法
0.创建/声明一个数组 1 2 3 String[] aArray = new String[5]; String[] bArray = {"a","b",&q ...
- 一些git命令
git push --set-upstream origin release 强制将add的数据提交到 release分支.
- was7 安装遇到问题(Linux平台Redhat 6)
1../launchpad.sh 无法启动安装,提示无法找到浏览器 解决:直接进入WAS文件夹,执行install cd WAS ./install 2.安装时中文乱码 设置区域为美国: LANG=e ...
- php圖片中寫入字符串然後生成圖片下載到本地
<?php /** * 生成卡片得類 * Enter description here ... * @author perry * @time 2014-03-03 10:02:20 */ cl ...
- 在Ios里UIWebView参入js
//修改图片大小适应webView宽高度 [webView stringByEvaluatingJavaScriptFromString: @"var sc ...
- 【工具推荐】ELMAH——可插拔错误日志工具
今天看到一篇文章(构建ASP.NET网站十大必备工具(2)),里面介绍了一个ELMAH的错误日志工具,于是研究了一下. ELMAH 是 Error Logging Modules and Handle ...
- js 获取div 图片高度
使用jquery获取网页中图片的高度其实很简单,有两种常用的方法都可以打到我们的目的 $("img").whith();(返回纯数字) $("img").css ...
- 数据结构-Hash表
实现: #ifndef SEPARATE_CHAINING_H #define SEPARATE_CHAINING_H #include <vector> #include <lis ...