您的位置:首页 > 编程语言

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

2007-02-27 17:49 363 查看
源代码结构:
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了,或者先看看别的例子,也是这样吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: