现在比较火的http server主要是apache nginx 。apache的主要优点是稳定,bug少,属于阻塞式的,所以对于高并发的情景下表现并不好。
而nginx最近几年越来越火,属于非阻塞式的,擅长高并发的情景。
如果追求性能应该选择nginx,而如果追求的是稳定,选择apache就好
微信那边自己开发了一个http server。估计也是从安全的角度考虑的。
看了一下tinyhttpd的源码,温顾了一下tcp编程
基本流程如上图 linux下的TCP编程
而http server 主要还是在while循环中一直拉去TCP包,从包头中解析出GET POST 字符串
从而进行一些CGI类的操作
CGI 不太懂 common gateway interface 通用网关接口,主要作用是
定义了利用程序的标准输入输出流,完成 HTTP 通信。HTTP 是文本协议,每次请求的文本以标准输入流的形式进入服务器端 CGI 程序,创建进程;然后进程的标准输出流作为响应
比如是显示某一路劲下的某一html文件
HTTP的一些信息也是通过发送send 和recv实现的
看代码:
void not_found(int client)
{
char buf[1024];
sprintf(buf, "HTTP/1.0 404 NOT FOUND\r\n");
send(client, buf, strlen(buf), 0);
sprintf(buf, SERVER_STRING);
send(client, buf, strlen(buf), 0);
sprintf(buf, "Content-Type: text/html\r\n");
send(client, buf, strlen(buf), 0);
sprintf(buf, "\r\n");
send(client, buf, strlen(buf), 0);
sprintf(buf, "<HTML><TITLE>Not Found</TITLE>\r\n");
send(client, buf, strlen(buf), 0);
sprintf(buf, "<BODY><P>The server could not fulfill\r\n");
send(client, buf, strlen(buf), 0);
sprintf(buf, "your request because the resource specified\r\n");
send(client, buf, strlen(buf), 0);
sprintf(buf, "is unavailable or nonexistent.\r\n");
send(client, buf, strlen(buf), 0);
sprintf(buf, "</BODY></HTML>\r\n");
send(client, buf, strlen(buf), 0);
}