tinyhttpd简介
一:简介:
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即可。
最新文章
- ximalaya
- JQmeter显示进度条
- android intent隐式调用之一个应用程序启动另一个应用程序
- For循环输出九九乘法表
- ibatis 分页的简单实现
- Android WebView的使用方法总结
- SGU 438 The Glorious Karlutka River =) ★(动态+分层网络流)
- C#常用的命名规范
- Android_Studio常用插件
- Educational Codeforces Round 9
- Automake创建项目
- Sql Server优化---统计信息维护策略
- CSS3选择器~一看吓一跳,这么多不会
- 六大设计原则(四)ISP接口隔离原则(上)
- OS history
- C# X509Certificate类 调用证书
- @RequestBody,@ResponseBody
- Ping监控脚本
- POJ 1655 - Balancing Act - [DFS][树的重心]
- ORACLE workflow审批界面显示附件信息和附件的下载链接(转)
热门文章
- FFT初步代码分析和逼近曲线
- MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引
- oracle-PL/SQL1
- day37 09-Struts2和Hibernate整合环境搭建
- Leetcode47. Permutations II全排列2
- XMLHttpRequest cannot load JSONP
- Ubuntu下安装Mongo方法
- Least Common Multiple (最小公倍数,先除再乘)
- Codeforces Round #263 (Div. 2) A. Appleman and Easy Task【地图型搜索/判断一个点四周‘o’的个数的奇偶】
- 基于OPNET的路由协议仿真教程(AODV、OLSR 、DSR等)