Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165837
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 317
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-04 12:49
个人简介

专注于服务器开发技术

文章分类

全部博文(34)

文章存档

2015年(5)

2014年(29)

我的朋友

分类: Web开发

2014-12-02 20:08:53

1.基本概念
4个基本对象:TCP链接,服务器(Server),http请求,进程(process)
2.数据结构
(1)request_rec:当前http请求表( 双向链表),存储http请求头,状态,资源池等信息

点击(此处)折叠或打开

  1. struct request_rec {
  2. /** 和该请求相关联的池 */
  3. apr_pool_t *pool;
  4. /** 到客户端的连接 */
  5. conn_rec *connection;
  6. /** 处理本连接的虚拟主机 */
  7. server_rec *server;

  8. /** 如果有外部重定向,指向请求重定向的指针 */
  9. request_rec *next;
  10. /** 如果是内部重定向,指向前一个请求的指针 */
  11. request_rec *prev;

  12. ......

  13. }
(2)server_rec:虚拟主机表(单链表),存储服务器名称、服务器定义、资源和限制、日志信息等

点击(此处)折叠或打开

  1. struct server_rec {
  2. /** 本服务器所运行的进程 */
  3. process_rec *process;
  4. /** 链表中的下一个服务器 */
  5. server_rec *next;
  6. /** 服务器的名称 */
  7. const char *defn_name;
  8. /** 服务器在配置文件中定义的行数 */
  9. unsigned defn_line_number;
  10. /* 契约信息*/
  11. /** 管理员的契约信息*/
  12. char *server_admin;
  13. /** 服务器的主机名 */
  14. char *server_hostname;
  15. ...
  16. }
(3)conn_rec:TCP连接表
一个conn_rec对象也对应着一个或者多个request_rec对象.

点击(此处)折叠或打开

  1. struct conn_rec {
  2. /** 和此连接相关的池 */
  3. apr_pool_t *pool;
  4. /** 此连接进入的服务器 */
  5. server_rec *base_server;
  6. /** 被 http_vhost.c 使用 */
  7. void *vhost_lookup_data;
  8. /* 关于连接本身的信息 */
  9. /** 本地地址 */
  10. apr_sockaddr_t *local_addr;
  11. /** 远端地址 */
  12. apr_sockaddr_t *remote_addr;
  13. /** 客户端的IP地址 */
  14. char *remote_ip;
  15. /** 如果可以获取,则为客户端的DNS名称;如果没有检查则为NULL;
  16. * 如果没有发现,就为“”。
  17. * 该字段只是为get_remote_host() 使用。
  18. */
  19. char *remote_host;
  20. /** 如果做rfc1413的查找则设定。
  21. * 该字段只是为get_remote_host() 使用。
  22. */
  23. char *remote_logname;
  24. /** 我们还在谈话么? */
  25. unsigned aborted:1;
  26. /**我们将要为另一个请求保持此连接的激活?
  27. * @see ap_conn_keepalive_e
  28. */
  29. ap_conn_keepalive_e keepalive;
  30. /** 我们做过double-reverse DNS? -1 为是/失败,0为没有。
  31. * 1为是/成功。
  32. */
  33. signed int double_reverse:2;
  34. /** 我们使用它多少次? */
  35. int keepalives;
  36. /** 服务器的IP地址 */
  37. char *local_ip;
  38. /** 当UseCanonicalName设定为DNS时,为 ap_get_server_name 使用。
  39. * (忽略 HostnameLookups的设定) */
  40. char *local_host;
  41. /** 连接的ID,每个连接都不同 */
  42. long id;
  43. /** 包含连接的每服务器配置结构的指针的配置向量 */
  44. struct ap_conf_vector_t *conn_config;
  45. /** *this* 连接的笔记:从一个连接发送笔记到另一个连接。
  46. * 必须在本连接的所有请求上保持正确。
  47. */
  48. apr_table_t *notes;
  49. /**本连接所使用的输入过滤链表 */
  50. struct ap_filter_t *input_filters;
  51. /**本连接所使用的输出过滤链表 */
  52. struct ap_filter_t *output_filters;
  53. /** 本连接得分板信息的处理函数 */
  54. void *sbh;
  55. /** 为所有bucket/brigade创建所使用的bucket 分配器 */
  56. struct apr_bucket_alloc_t *bucket_alloc;
  57. /** 本连接的当前状态 */
  58. conn_state_t *cs;
  59. /** 输入过滤器还有悬而未决的数据么? */
  60. int data_in_input_filters;
  61. };
(4) process_rec:操作系统内核对象(进程),以进程的方式加载动态链接库

点击(此处)折叠或打开

  1. struct process_rec {
  2.     /** 全局池,进程退出后清除*/
  3.     apr_pool_t *pool;
  4.     /** 配置池. 重启后清除 */
  5.     apr_pool_t *pconf;
  6.     /** 程序名 */
  7.     const char *short_name;
  8.     /** 命令行参数 */
  9.     const char * const *argv;
  10.     /** 命令行参数个数 */
  11.     int argc;
  12. };


参考:《Apache模块开发学习指南》
阅读(1585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~