一:简介:

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即可。

最新文章

  1. ximalaya
  2. JQmeter显示进度条
  3. android intent隐式调用之一个应用程序启动另一个应用程序
  4. For循环输出九九乘法表
  5. ibatis 分页的简单实现
  6. Android WebView的使用方法总结
  7. SGU 438 The Glorious Karlutka River =) ★(动态+分层网络流)
  8. C#常用的命名规范
  9. Android_Studio常用插件
  10. Educational Codeforces Round 9
  11. Automake创建项目
  12. Sql Server优化---统计信息维护策略
  13. CSS3选择器~一看吓一跳,这么多不会
  14. 六大设计原则(四)ISP接口隔离原则(上)
  15. OS history
  16. C# X509Certificate类 调用证书
  17. @RequestBody,@ResponseBody
  18. Ping监控脚本
  19. POJ 1655 - Balancing Act - [DFS][树的重心]
  20. ORACLE workflow审批界面显示附件信息和附件的下载链接(转)

热门文章

  1. FFT初步代码分析和逼近曲线
  2. MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引
  3. oracle-PL/SQL1
  4. day37 09-Struts2和Hibernate整合环境搭建
  5. Leetcode47. Permutations II全排列2
  6. XMLHttpRequest cannot load JSONP
  7. Ubuntu下安装Mongo方法
  8. Least Common Multiple (最小公倍数,先除再乘)
  9. Codeforces Round #263 (Div. 2) A. Appleman and Easy Task【地图型搜索/判断一个点四周‘o’的个数的奇偶】
  10. 基于OPNET的路由协议仿真教程(AODV、OLSR 、DSR等)