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

原文地址:https://www.cnblogs.com/gqtcgq/p/7247138.html