一:简介:

tinyhttpd是由J. DavidBlackstone在1999年编写的,实现了一个很简单的web服务器。支持GET和POST方法,总代码量也就在500行左右,可以用来学习HTTP协议和UNIX系统调用。

http://tinyhttpd.sourceforge.net/

二:流程:

首先绑定套接字到本地地址,套接字的端口是由系统分配的,而不是预先设置好的。然后就在一个whilt(1)的死循环中处理到来的链接。也就是先调用accept等待链接,连接到来后,新建一个线程处理该链接。这里仅仅是简单的通过线程来处理链接,因而无法满足大并发的要求,在虚拟机通过webbench测试,仅仅能处理380个左右的并发。

在线程中,解析HTTP请求的方法和URL,目前支持的方法只有GET和POST,如果是其他方法,直接返回给客户端“501 Method Not Implemented”。

根据请求的URL,在htdocs目录中寻找相应的文件,如果未找到,则返回错误信息:"404 NOT FOUND"。

根据请求的URL,要么将文件内容直接返回给客户端,要么执行perl脚本,将客户端的请求发送给perl脚本,然后将执行的结果返回给客户端。

三:细节

1:perror

       #include <stdio.h>
void perror(const char *s); #include <errno.h>
const char *sys_errlist[];
int sys_nerr;
int errno;

perror主要是将errno转换为可读的字符串消息,它将消息输出到标准错误输出,首先打印字符串s,其后跟一个冒号和空格,然后就是errno对应的字符串,最后跟一个换行符。

举例如下:

#include<errno.h>
#include<stdio.h> int main(intargc, char **argv)
{
errno = atoi(argv[1]);
perror("the errmsg is ");
}

./10

theerrmsg is : Success

./110

theerrmsg is : No child processes

./119

theerrmsg is : No such device

./1255

theerrmsg is : Unknown error 255

2:SIGPIPE

在调试过程中,遇到一个问题,就是程序有时会莫名其妙的自己停掉,没有任何错误输出。经过跟踪,才发现原来是因为SIGPIPE信号的问题。

《UNPv1》的5.13中说明,当一个进程向某个已经收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号,而该信号的默认行为是终止进程,因此,进程必须捕获它以免异常的终止。

不论该进程是捕获了该信号并从其信号处理程序返回,还是简单的忽略该信号,写操作都将返回EPIPE错误。

这里,直接将该信号的处理方式设置为SIG_IGN即可。

tinyhttpd简介的更多相关文章

  1. Tinyhttpd阅读笔记

    1.简介 tinyhttpd是一个开源的超轻量型Http Server,阅读其源码,可以对http协议,微型服务器有进一步的了解. 源码链接: 参考博客:tinyhttpd源码分析 2.笔记 ---- ...

  2. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  3. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  4. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  5. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  6. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  7. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  8. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

  9. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

随机推荐

  1. IO多路复用,协程

    https://www.cnblogs.com/wangjun187197/p/9642429.html Python之路--协程/IO多路复用 I/O复用模型 此模型用到select和poll函数, ...

  2. 插头DP智障操作合集

    今天一共四道插头DP[其实都差不多],智障错误出了不下五个:D 来,让我好好数落我自己一下 直接写代码注释里吧 Eat the Trees #include<iostream> #incl ...

  3. linux应用系统日志

    在一个典型的LAMP(Linux+Apache+Mysql+Perl)应用环境里: Apache & Nginx; 查找访问和错误日志, 直接找 5xx 错误, 再看看是否有 limit_zo ...

  4. ACM-ICPC 2019 西安邀请赛 D.Miku and Generals(二分图+可行性背包)

    “Miku is matchless in the world!” As everyone knows, Nakano Miku is interested in Japanese generals, ...

  5. CodeVS3958 火车进站

    3958 火车进站 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master         题目描述 Description 火车站内往往设有一些主干线分叉出去的铁路支路 ...

  6. System.getProperty()和getenv()

    System.getproperty(String name) 获取系统属性 System.getProperties() 获取所有系统属性 System.getenv(String name) 获取 ...

  7. js 详解setTimeout定时器

    setTimeout: 定时器函数 第一个参数是匿名函数,第二个参数是延迟执行时间 setTimeout(function(){},time) 注意: 1.setTimeout函数是Window对象提 ...

  8. vue使用flexible和px2rem实现移动端适配

    首先下载flexible.js和px2rem npm install px2rem-loader 对webpack进行配置.进入build文件夹对utils.js中的postcssLoader做如下修 ...

  9. babel 7.x 结合 webpack 4.x 配置

    今天在学习webpack的使用的时候,由于学习的教程是2018年初的,使用的是 webpack 3.x 和 babel 6.x ,然后学习的过程中出现的了很多问题. 解决问题之后,总结一下新的 bab ...

  10. php文件上传$_FILES数组格式

    <form action="" enctype="multipart/form-data" method="post"> < ...