web server(web服务器)简单了解

亲爱的老公,希望我们共同加油吧

什么是web server

  • 定义
  • tinyhttpd(一个只有500行的web server程序)
  • CGI(Common Gateway Interface)

定义

Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的(有没有支持除HTTP之外的协议的web服务器,作者没有考证过),说的是一回事。

tinyhttpd

源码位置:https://github.com/EZLippi/Tinyhttpd
所有函数的声明:

void accept_request
(int);  
处理从套接字上监听到的一个 HTTP 请求
void bad_request(int);  
返回给客户端这是个错误请求
void cat(int, FILE *);  
读服务器上某个文件写到 socket 套接字
void cannot_execute(int);  
执行 cgi 程序时出现的错误
void error_die(const char *);  
把错误信息写到 perror 并退出
void execute_cgi(int, const char *, const char *, const char *);  运行 cgi 程序的处理,也是个主要函数
int get_line(int, char *, int);  
读取套接字的一行
void headers(int, const char *);  
把 HTTP 响应的头部写到套接字
void not_found(int);  
主要处理找不到请求的文件时的情况
void serve_file(int, const char *);  
用 cat 把服务器文件返回给浏览器
int startup(u_short *);  
初始化 httpd 服务,包括建立套接字,绑定端口,进行监听等
void unimplemented(int);  
返回给浏览器表明收到的 HTTP 请求所用的 method 不被支持

运行tinyhttpd(ubuntu16.04):

1)chmod 444 htdocs/index.html
2)Makefile中编译的一行改为gcc -W -Wall -o httpd httpd.c -lpthread
333行改为void *accept_request(void *);  
4)tinyhttpd.c:
void *accept_request(void* tclient)   {     
int client = *(int *)tclient;   
5497行(行号不一定对)改为if (pthread_create(&newthread , NULL, accept_request, (void*)&client_sock) != 0)
6)make
7)./httpd
8)浏览器输入localhost:port(改为./httpd执行后输出端口号)查看结果

CGI(Common Gateway Interface)

CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
http://blog.csdn.net/kaloha3/article/details/8548027介绍的比较详细
POST与GET的区别:
以 GET方式接收的数据是有长度限制,而用 POST方式接收的数据是没有长度限制的。并且,以 GET方式发送数据,可以通过 URL的形式来发送,但 POST方式发送的数据必须要通过 Form才到发送。
URL编码:
管是POST还是GET方式,客户端浏览器发送给服务器的数据都不是原始的用户数据,而是经过URL编码的。此时,CGI的环境变量Content_type将被设置,如Content_type = application/x-www-form-urlencode就表示服务器收到的是经过URL编码的包含有HTML表单变量数据。
编码的基本规则是:
变量之间用“&”分开;
变量与其对应值用“=”连接;
空格用“+”代替;
保留的控制字符则用“%”连接对应的16禁止ASCII码代替;
某些具有特殊意义的字符也用“%”接对应的16进制ASCII码代替;
空格是非法字符;
任意不可打印的ASCII控制字符均为非法字符。
所以,CGI程序从标准输入或环境变量中获取客户端数据后,还需要进行解码。解码的过程就是URL编码的逆变:根据“&”和“=”分离HTML表单变量,以及特殊字符的替换。
CGI数据输出:
CGI程序如何将信息处理结果返回给客户端?这实际上是CGI格式化输出。在CGI程序中的标准输出stdout是经过重定义了的,它并没有在服务器上产生任何的输出内容,而是被重定向到客户浏览器,这与它是由C,还是Perl或Python实现无关。
(1) CGI标题
CGI的格式输出内容必须组织成标题/内容的形式。CGI标准规定了CGI程序可以使用的三个HTTP标题。标题必须占据第一行输出!而且必须随后带有一个空行。
标题
描述
Content_type (内容类型)
设定随后输出数据所用的MIME类型
Location (地址)
设定输出为另外一个文档(URL)
Status (状态)
指定HTTP状态码

MIME:
向标准输出发送网页内容时要遵守MIME格式规则:
任意输出前面必须有一个用于定义MIME类型的输出内容(Content-type)行,而且随后还必须跟一个空行。如果遗漏了这一条,服务将会返回一个错误信息。(同样使用于其他标题)
C语言:
printf( “Content-type:text/html\n\n”);
printf(“Welcome\n”);

MIME类型以类型/子类型(type/subtype)的形式表示。
其中type表示一下几种典型文件格式的一种:
Text、Audio、Video、Image、Application、Mutipart、Message
Subtype则用来描述具体所用的数据格式。
Application/msword
微软的Word文件
Application/octet-stream
一种通用的二进制文件格式
Application/zip
Zip压缩文件
Application/pdf
Pdf文件

Location:
使用Location标题,一个CGI可以使当前用户转而访问同一服务器上的另外一个程序,甚至可以访问另外一个URL,但服务器对他们的处理方式不一样。
使用Location的格式为:Location:Filename/URL,例如:
print “Location:/test.html\n\n”;
这与直接链接到test.html的效果是一样的。
print “Location:http://www.chinaunix.com/\n\n”
由于该URL并不指向当前服务器,用户浏览器并不会直接链接到指定的URL,而是给用户输出提示信息。

参考文章:

http://www.cnblogs.com/zhaoyl/archive/2012/10/10/2718575.html
http://blog.csdn.net/jcjc918/article/details/42129311
http://blog.csdn.net/kaloha3/article/details/8548027
http://blog.csdn.net/sodawaterer/article/details/73289779

你可能感兴趣的:(#,web-server)