一:简介:
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即可。