ACE5.5.1源代码学习笔记(一)

    技术2022-05-11  70

    源代码结构: ACE_wrappers ACE 关于ACE库的全部代码 ACEXML ace的XML解析 问题:ACE是一个网络协议,与XML这个结构有什么关系? Apps 提供了一些使用ACE特征的应用程序 Drwho:提供了分布式的rwho功能。可以侦听谁登录到网络上 Gatway:实现了面向连接的应用程序极的网关。能够通过TCP/IP连接将消息包从源地址转发到目的地址。 Gperf GNU hash函数的生成者。与TAO IDL整合了用于生成查找函数,针对操作IDL 接口函数。   JAWS是一个遵循HTTP1.0协议的Web server,并且用ACE写的。阐述了久经考验的ACE特性   我就从JAWS入手学习ACE。从代码量上它并不大,而且它涉及到的应用也是我能理解的Http1.0 大概看了一下代码,发现分为以下几个部分 注释:一般一个开源项目都是分为几大部分,从文件名和类名以及函数名称上可以进行一些猜测。 文件类型: Am文件,是自动生成makefile文件用的中间文件不用管它 Auth文件,不知 Bor文件,不知 Cgi文件,不知 Conf文件,http服务器的配置文件,定义了web服务的端口号   源程序文件:。H。cpp HTTP_Config.h HTTP_Config.cpp 从名称上可以看出是http连接的一些配置信息,包含两个类 HTTP_Config,只有两个HTTP_Config_Info类型的成员变量,而且是一个共有,一个私有,一个似乎用于访问,另一个用于存储 HTTP_Config_Info,再看这个类,首先他定义了一个友元,似乎是可以访问他的任何一个成员变量,成员变量包括: 虚拟根目录,CGI文件的目录,用户目录,一个目录的索引首文件 很奇怪,为什么定义一些public的成员变量,又定义一些私有的访问这些成员变量的函数? 很奇怪,为什么又定义一些private的同名的成员变量,当然,并不是完全重名,而是加了后缀作为区分。 带着这些问题,我们来看HTTP_Config.cpp文件,可以得到一点点答案。 首先文件一开始定义了ACE_RCSID,这个肯定是ACE库的函数,从参数上看,似乎是做了一些记录。我们先不去管它,稍后再去查这个函数。 下一行HTTP_Config_Info *HTTP_Config::instance_ = 0;显然是对HTTP_Config类中的静态成员变量进行初始化,于是我们再回头看一下class HTTP_Config的定义,原来开始看错了   公有成员函数:static HTTP_Config_Info *instance (void);静态,进行实例的初始化,或者说创建 私有成员变量:static HTTP_Config_Info *instance_;静态,存储实例   在类中函数HTTP_Config_Info * HTTP_Config::instance (void) 调用友元类HTTP_Config_Info中的私有成员函数,设置参数为0。即进行初始化工作。 这个类HTTP_Config就结束了。就这么一点点东西   下一个类是HTTP_Config_Info,这个类是直接管理http的配置值,这个类中的变量设置函数设置的均是其私有成员变量。很奇怪,只有访问函数,没有设置函数,而且,每个私有成员变量都有对应得共有成员变量。访问函数中用到的都是私有成员变量。 仔细看过后发现:哈哈,我又看错了,在HTTP_Config_Info类中,public的是访问函数,私有的分别是成员变量和设置函数。之所以把设置函数也设置设置为私有,是不想让用户随便使用设置函数,只有该类的友元,也就是管理类,才可以做设置的动作。     在设置函数中,我们可以看到,涉及到了ACE的东西 首先在设置根目录的时候,如果用户传进来的目录参数是空,就要使用默认的参数,这个参数的取得是使用了ACE_OS::getenv这个函数。也就是说在ACE的函数库中,提供了根据表示从配置文件中获取字符串的功能。   这个文件初步分析完毕了。总结一下自己犯的错误,误将函数看成了成员变量。   再看下面的文件: HTTP_Handler似乎是说关于句柄的管理问题 HTTP_Helpers似乎是说关于帮助信息的管理问题 HTTP_Request.这个一定是HTTP的客户端向服务器发送请求,这里应该包含tcp的接收函数recv HTTP_Response:这个一定是HTTP的服务器向客户端发送应答,这里应该包含tcp的发送函数send HTTP_Server 这个估计是主函数了 IO这个应该是关于发送接受的封装函数,可能直接和ACE打交道的地方。   JAWS_Concurrency这个不太清楚谁什么东西 JAWS_Pipeline 从文件名称上看似乎用到了类似于管道的技术 JAWS_Pipeline_Handler似乎是关于管道句柄的管理。 Main这个一定是程序的入口函数 Parse_Headers 这个似乎解析http报头的东西   我们首先想想一下httpserver的程序是个什么东西,如果我们编写要考虑什么因素。 首先这是一个server程序,应该能够同时连接多个客户端,这些客户端就是用户的浏览器,当用户输入网址的端口号时相当于请求与本机建立TCP连接,即connect(IP::PORT).所以server应该首先进行侦听,当有用户连接了,会创建一个用户句柄,这个句柄如何管理?是不是应该放入一个数据结构中?当server建立后,server会歌client发送一些信息,并且这些信息应该按照http的协议格式。那么server如何给cleint发送信息?如何组包?而server应该实时调用recv函数等待数据的到达,并且要接包。 如何调用recv函数?是不是要用到ACE的网络框架?创建一些ACE的对象?   带着这些问题,我们来开始分析工作,首先分析main.cpp文件: 看到main函数中很是奇怪,似乎只是声名了一个变量,ACE_Service_Config daemon;这个是个什么东西?在注释中又说 // The configured service creates threads, and the  // server won't exit until the threads die. 似乎这个小东西创建了什么线程,而且只有当这些线程退出后程序才会退出。 在主函数还调用了一个函数ACE_OS::signal,似乎是设置了什么信号量 在下面还有一个关于daemon的调用。daemon.open (argc, argv, ACE_DEFAULT_LOGGER_KEY, 0) != 0 似乎是open一个什么东西。     看到这里我们一定菜菜的,跟想象一点都不一样。   只能看ACE了,或者先看看别的例子,也是这样吗?    

    最新回复(0)