ACE与ASIO之间关于Socket编程的比较

ACE是一个很成熟的中间件产品,为自适应通讯环境,但它过于宏大,一堆的设计模式,架构是一层又一层,对初学者来说,有点困难。
ASIO是基本Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。

最近分析ASIO的源代码,让我无不惊呀于它设计。在ACE中开发中的内存管理一直让人头痛,ASIO的出现,让我看到新的曙光,成为我新的好伙伴。简单地与ACE做个比较。

1.层次架构:
ACE底层是C风格的OS适配层,上一层基于C++的wrap类,再上一层是一些框架(Accpetor, Connector,Reactor等),最上一层是框架上服务。
ASIO与之类似,底层是OS的适配层,上一层一些模板类,再上一层模板类的参数化(TCP/UDP),再上一层是服务,它只有一种框架为io_service。

2.涉及范围:
ACE包含了日志,IPC,线程,共享内存,配置服务等。
ASIO只涉及到Socket,提供简单的线程操作。

3.设计模式:
ACE主要应用了Reactor,Proactor等。
而ASIO主要应用了Proactor。

4.线程调度:
ACE的Reactor是单线程调度,Proactor支持多线程调度。
ASIO支持单线程与多线程调度。

5.事件分派处理:
ACE主要是注册handler类,当事件分派时,调用其handler的虚挂勾函数。实现ACE_Handler/ACE_Svc_Handler/ACE_Event_handler等类的虚函数。
ASIO是基于函数对象的hanlder事件分派。任何函数都可能成功hanlder,少了一堆虚表的维护,调度上优于ACE。

6.发布方式:
ACE是开源免费的,不依赖于第3方库, 一般应用使用它时,以动态链接的方式发布动态库。
ASIO是开源免费的,依赖Boost,应用使用时只要include头文件,不需动态库。

7.可移植性:
ACE支持多种平台,可移植性不存在问题,据说socket编程在linux下有不少bugs。
ASIO支持多种平台,可移植性不存在问题。

8.开发难度:
基于ACE开发应用,对程序员要求比较高,要用好它,必须非常了解其框架。在其框架下开发,往往new出一个对象,不知在什么地方释放好。
基于ASIO开发应用,要求程序员熟悉函数对象,函数指针,熟悉boost库中的boost::bind。内存管理控制方便。

我个人觉得,如果应用socket编程,使用ASIO开发比较好,开发效率比较高。ACE适合于理论研究,它本来就是源于Douglas的学术研究。

时间: 2025-01-30 08:20:41

ACE与ASIO之间关于Socket编程的比较的相关文章

服务器-不同计算机之间的Socket编程

问题描述 不同计算机之间的Socket编程 服务端代码 import java.net.ServerSocket; import java.net.Socket; public class ChartServer { public static void main(String[] args) { try { System.out.println("服务器开启..."); ServerSocket ss = new ServerSocket(7234); Socket s = ss.a

socket编程-Windows 和Linux 网络性能测试

问题描述 Windows 和Linux 网络性能测试 在windows 和linux 之间进行socket编程,进行互相收发数据.在收发完成之后,想具体的测试一下性能,有什么好的办法吗? PS:windows和Linux用的都是千兆的网卡,想测试一下具体的性能指标. 解决方案 windows下有性能计数器,linux下也有一些性能诊断的工具,可以使用.至于收发本身可以用压力测试工具测试 解决方案二: windows有perf工具来分析查看 Linux下面是gprof等 解决方案三: 采用wire

socket编程 客户端与服务器之间传递消息

问题描述 socket编程 客户端与服务器之间传递消息 客户端向服务端发送一字符串, BufferedWriter pw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); pw.write("hello"); pw.flush(); 在服务端获取: BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStre

boost.asio系列——socket编程

asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下:     #include <iostream>    #include <boost/array.hpp>    #include <boost/asio.hpp>     using boost::asio::ip::tcp;     int main(int argc, char* argv

续实例解析SOCKET编程模型之异步通信篇(上)

编程|异步 .NET 框架的 Socket 类实际上是 Winsock32 API 提供的套接字服务的托管代码版本.其中Socket 类为网络通信提供了一套丰富的方法和属性,大多数情况下,Socket 类方法只是将数据封送到它们的本机Win32 副本中并处理任何必要的安全检查.Socket 类允许使用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输.Socket 类遵循异步方法的 .NET Framework 命名模式:例如,同步 Receive 方法对应于异步 Be

PHP Socket 编程过程详解

介绍 Socket用于进程间通信.进程间通信通常基于客户端-服务端模型.此时,客户端-服务端是可以彼此交互的应用程序.客户端和服务端之间的交互需要连接.Socket编程负责的就是为应用程序之间建立可进行交互的连接. 在本文中,我们将学习如何用PHP创建一个简单的客户端-服务端.我们还将学习如何客户端应用程序如何发送消息到服务端,以及如何从服务端接受消息. 使用代码 目的:开发一个客户端用于发送string消息到服务端,服务端将相同的信息反转后返回给客户端. PHP服务器 第1步:设置变量,如"主

在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分

编程|网络|异步 ///////////////////////////////////////////////////////////////////////////////////////////* 标题:在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分 当看到.NET中TcpListener和TcpClient的时候,我非常高兴,那就是我想要的通讯模式但是使用之后发现它们的力量太单薄了,我们需要一个更好的类库来替代它们. 下面提供了一些类,可以

Linux Socket编程获取服务器时间

客户端向服务器端发送请求,服务器收到请求做相应的处理,将处理结果传回客户端.下面采用TCP协议实现服务器和客户端之间的连接. 1. 客户端 约定双方的传输协议(UDP或者TCP),根据传输协议创建socket: 服务器的IP地址和端口号: 连接服务器: 获取服务器传递回来的数据. #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #i

浅谈Socket编程及Java实现

Java是一种可用于进行网络编程的语言,它提供了两种功能强大的网络支持机制:URL访问网络资源的类和用Socket通讯的类,来满足不同的要求.一是URL用于访问Internet网上资源的应用:另一种是针对client/server(客户端/服务器)模式的应用以及实现某些特殊的协议的应用,它的通讯过程是基于TCP/IP协议中传输层接口socket实现的.本文想简单的介绍一下Socket编程的Java实现方法. 客户基于服务器之间使用的大部分通讯组件都是基于socket接口来实现的.Socket是两