main函数分析;

一,参数设置:  读取命令行参数

         配置文件参数

      读取参数,设置对应的全局变量。主要参数有:配置文件;资源目录;进程ID文件;日志文件;字符集;主机名及端口号...

二,参数处理:重点分析,主机名及端口号,damon

  1,主机名及端口号

    解析主机名,获取对应IP地址,初始化监听套接字(包括:socket,bind,listen)

    以IPv4为例:

      listen_fd=socket(AF_INET,SOCK_STREAM,0);创建套接字

      套接字选项设置:设置方法有fcntl,setsockopt

      1,fcntl(listen_fd,F_SETFD,FD_CLOEXEC); 设置close-on-exec,exec进程时,关闭此文件描述符

      2,  int i=1;

           setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,(void*)&i,sizeof(i));可重用本地地址

      3,bind(listen_fd,struct sockaddr* -,sizeof(-));绑定套接字和IP:端口

      4,listen(listen_fd,1024);设置监听套接字最大队列长度

  2,若不是调试模式,则应该设置为damon模式,

    switch(fork()){

      case 0: break;  子进程继续执行

      case -1:    出错,退出程序

      default:exit(-1);  父进程退出

    }

  3,信号处理设置:

    SIGTERM: kill发送系统中断进程信号

    SIGINT: 用户终端Ctrl+C中断进程

    SIGHUP:一般用来通知守护进程再次读取配置文件等作用,因为守护进程没有终端,不会收到此信号。此处用于再次读取日志文件

    SIGCHLD:子进程退出时,会发送该信号给父进程,父进程应该捕捉,否则将产生僵尸进程

    SIGPIPE:管道读关闭时写,套接字不再连接时写,都会产生此信号。网络编程中出现的很多

  4,服务器主循环:

    若收到SIGHUP信号,则再次打开日志文件(覆盖),若需要可备份

      select模式,多路复用:阻塞模式

      FD_ZERO(&lfdset);清空描述符集

      FD_SET(listen_fd,&lfdset);条件套接字描述符到描述符集中

      设置select阻塞读,select(listen_fd+1,&lfdset,NULL,NULL,NULL);永远阻塞,直到listen_fd可读;

    若listen_fd可读,调用accept,获得已连接套接字描述符,若出错(EAGAIN,资源暂不可用;EINTR,中断函数调用;ECONNABORT,连接中断。continue,try again),否则异常退出。

    若连接成功,fork(),子进程处理请求,父进程继续循环,监听。

      子进程关闭监听套接字,调用 handle_request 函数处理请求,退出;父进程关闭已连接套接字,继续循环监听。

  5,handle_request函数解析

    超时设置:利用信号SIGALRM,alarm(60);

      [设置TCP_NOPUSH套接字选项]

    读取请求:循环read,把读取的数据存入全局变量request中,每次读取后,重新设置超时alarm(60)

    请求解析: get_request_line()

      解析请求的第一行:分三部分:方法,路径,协议

      解析请求其余部分:name:value...初始化对应的全局变量

    方法字符串分解:方法(GET,HEAD,POST),查询字符串query,?之后

    路径解析:获取文件名file

    超时设置,SIGALRM(写超时设置)

    响应:构造请求响应(报头及实体),写套接字(循环write),发送响应。

mini-httpd源码分析-mini-httpd.c的更多相关文章

  1. httpd源码编译安装

    什么是编译安装——编译:将源代码变为机器可执行的代码文件.安装:将可执行文件安装到操作系统里,才可以使用. 一.下载httpd源码包 在官网上下载httpd源码包http://httpd.apache ...

  2. CentOS 6.4源码编译安装httpd并启动测试

    今天来总结一下在Linux中软件安装,通常我们应该知道,安装软件有两种方法:一种是软件包的安装,也就是rpm包的安装,就是指这些软件包都是 已经编译好的二进制rpm包,我们通过rpm安装工具和yum安 ...

  3. InfluxDB源码阅读之httpd服务

    操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 服务模块介绍 源码路径: github.com/influxda ...

  4. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

  5. angular源码分析:angular的整个加载流程

    在前面,我们讲了angular的目录结构.JQLite以及依赖注入的实现,在这一期中我们将重点分析angular的整个框架的加载流程. 一.从源代码的编译顺序开始 下面是我们在目录结构哪一期理出的an ...

  6. angular源码分析:angular的源代码目录结构说明

    一.读源码,是选择"编译合并后"的呢还是"编译前的"呢? 有朋友说,读angular源码,直接看编译后的,多好,不用管模块间的关系,从上往下读就好了.但是在我看 ...

  7. wifidog源码分析 - 用户连接过程

    引言 之前的文章已经描述wifidog大概的一个工作流程,这里我们具体说说wifidog是怎么把一个新用户重定向到认证服务器中的,它又是怎么对一个已认证的用户实行放行操作的.我们已经知道wifidog ...

  8. HTTP服务器的本质:tinyhttpd源码分析及拓展

    已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享.最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhtt ...

  9. Tomcat源码分析——请求原理分析(中)

    前言 在<TOMCAT源码分析——请求原理分析(上)>一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握<TOMCAT源码分析——请求原 ...

  10. Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)

    Linux内核源码分析-链表代码分析 分析人:余旭 分析时间:2005年11月17日星期四 11:40:10 AM 雨 温度:10-11度 编号:1-4 类别:准备工作 Email:yuxu97101 ...

随机推荐

  1. django框架介绍

    主要内容 1.        Django框架发展 2.        Django架构,MTV模式 3.        开发流程 4.        开发实例——Poll python下各种框架 一 ...

  2. IE input X 去掉文本框的叉叉和密码输入框的眼睛图标

    从IE 10开始,type="text" 的 input 在用户输入内容后,会自动产生一个小叉叉(X),方便用户点击清除已经输入的文本对于type="password&q ...

  3. UESTC_冰雪奇缘 CDOJ 843

    艾莎女王又开始用冰雪魔法盖宫殿了. 她决定先造一堵墙,于是释放魔法让形为直角梯形的冰砖从天而降,定入冻土之中. 现在你将回答女王的询问:某段冻土上冰砖的面积. 注:多块冰砖之间会互相重叠,重叠部分要多 ...

  4. java POI读取excel 2007/2003

    2003版office excel读取 import java.io.FileNotFoundException; import java.io.IOException; import java.io ...

  5. PHP 文件打开/读取

    PHP Open File - fopen() 打开文件的更好的方法是通过 fopen() 函数.此函数为您提供比 readfile() 函数更多的选项. 在课程中,我们将使用文本文件 "w ...

  6. PHP MySQL Delete From 之 Delete

    删除数据库中的数据 DELETE FROM 语句用于从数据库表中删除记录. 语法 DELETE FROM table_name WHERE column_name = some_value 注释:SQ ...

  7. SDK调试出错小技巧=。=

    学习Unity小伙伴完全不懂Android编程抓错误是很困难的..... 1. 使用UnityPlayer.UnitySendMessage(); 发送到Unity使用OnGUI显示错误 2. 直接在 ...

  8. Android应用程序组件Content Provider的启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6963418 通过前面的学习,我们知道在Andr ...

  9. MySQL中innodb表主键设计原则

    主键设计的原则:1. 一定要显式定义主键2. 采用与业务无关的单独列3. 采用自增列4. 数据类型采用int,并尽可能小,能用tinyint就不用int,能用int就不用bigint5. 将主键放在表 ...

  10. JS转换Decimal带千分号的字符串显示

    var numberChars = "0123456789"; /* Convert to decimal string */ function toDecimalString(v ...