linux实验报告 联系客服

发布时间 : 星期六 文章linux实验报告更新完毕开始阅读49185a84336c1eb91b375d34

发送请求,然后服务器返回客户请求的信息。具体过程如下:

客户端: 服务器端:

用户选择一个链接 连接服务器 → 写请求 →

读取应答 ← 挂断 显示应答 html:解析 image:绘图 sound:运行 重复

接收请求 读取请求 处理请求:

目录:显示目录列表 文件:显示内容 .cgi文件:运行 不存在:错误消息 写应答

设计Web服务器所要编写的操作如下: (1)建立服务器

使用socklib.c中的make_server_socket (2)接收请求

使用accept来得到指向客户端的文件描述符。可以使用fdopen使得该文件描述符转换成缓冲流。 (3)读取请求 (4)处理请求 (5)发送应答

Web服务器协议: 客户端(浏览器)与Web服务器之间的交互主要包含客户的请求和服务器的应答。请求和应答的格式在超文本传输协议(HTTP)中有定义。HTTP使用纯文本。可以使用telnet和Web服务器进行交互。Web服务器在端口80监听。下面是两个例子: 第一个例子:

#telnet www.neu.edu.cn 80 Trying 202.118.1.7...

Connected to www.neu.edu.cn. Escape character is '^]'. GET /index.html HTTP/1.0

HTTP/1.0 403 Forbidden Server: squid/2.5.STABLE3 Mime-Version: 1.0

Date: Mon, 21 May 2007 03:15:58 GMT

33

Content-Type: text/html Content-Length: 732

Expires: Mon, 21 May 2007 03:15:58 GMT X-Squid-Error: ERR_ACCESS_DENIED 0 X-Cache: MISS from www.neu.edu.cn X-Cache: MISS from www.neu.edu.cn Connection: close

...::: Welcome to NEU WebSite :::...

Loading...

Please use

锟斤拷使锟斤拷



Generated Mon, 21 May 2007 03:15:58 GMT by www.neu.edu.cn (squid/2.5.STABLE3)

Connection to www.neu.edu.cn closed by foreign host.

第二个例子:

#telnet www.prenhall.com 80 Trying 165.193.123.253...

Connected to www.prenhall.com. Escape character is '^]'. GET /index.html HTTP/1.0

HTTP/1.1 200 OK

Server: Netscape-Enterprise/6.0 Date: Mon, 21 May 2007 03:20:54 GMT

34

Content-length: 327 Content-type: text/html

Last-modified: Mon, 09 Jun 2003 23:03:02 GMT Accept-ranges: bytes Connection: close

Connection to www.prenhall.com closed by foreign host.

这里只发送了一行请求,却接收了多行返回。 (1)HTTP请求:GET

telnet创建了一个socket并调用了connect来连接到Web服务器。服务器接受连接请求,并创建了一个基于socket的从客户端的键盘到Web服务器进程的数据通道。 接下来,输入请求: GET /index.html HTTP/1.0 一个HTTP请求包含有3个字符串。第一个字符串是命令,第二个是参数,第三个是所用协议的版本号。在该例子中,使用了GET命令,以index.html作为参数,使用了HTTP版本1.0。 HTTP还包含几个其他的命令。大部分Web请求使用GET,因为大部分时间中用户是单击链接来获取网页。GET命令可以跟几行参数。这里使用了简单的请求,以一个空行来表示参数的结束,并使用与本书前面提及的关于shell的相同约定。实际上,一个Web服务器只是集成了cat和ls的Unix shell。 (2)HTTP应答:OK

服务器读取请求,检查请求,然后返回一个请求。应答有两部分:头部和内容。头部以状态行起始,如下所示:

HTTP/1.1 200 OK

状态行含有两个或更多的字符串。第一个串是协议的版本,第二个串是返回码,200的文本解释是OK。这里请求的文件叫/info.html,而服务器给出应答表示可以得到该文件。如果服务其中没有请求的文件名,返回码将是404,其解释将是“未找到”。 头部的其余部分是关于应答的附加信息。在该例子种,附加信息包含服务器名、应答时间、服务器所发送数据类型以及应答的连接类型。一个应答头部可以包含有多行信息,以空行表示结束,空行位于Connection:close后面。 应答的其余部分是返回的具体内容。这里,服务器返回了文件/index.html的内容。 (3)HTTP小结

客户端和web服务器交互的基本结构如下: 1)客户端发送请求

GET filename HTTP/version 可选参数 空行

35

2)服务器发送应答

HTTP/version status-code status-message 附加信息 空行 内容

协议的完整描述可以参阅网上的版本1.0的RFC1945和版本1.1的RFC2068。

Web服务器必须接受客户的HTTP请求,并发送HTTP应答。请求和应答采用纯文本格式,是为了便于使用C中的输入/输出以及字符串函数读取和处理。

编写Web服务器: 要求Web服务器只支持GET命令,只接收请求行,跳过其余参数,然后处理请求和发送应答,主要循环如下: while(1){ fd=accept(sock, NULL, NULL); fpin=fdopen(fd,‖r‖); fgets(fpin, request, LEN); read_until_crnl(fpin); process_rq(request, fd); fclose(fpin); }

为了简洁,这里忽略了出错检查。

(1)处理请求

处理请求包含识别命令和根据参数进行处理: process_rq( char *rq, int fd ) { char cmd[BUFSIZ], arg[BUFSIZ]; /* create a new process and return if not the child */ if ( fork() != 0 ) return; strcpy(arg, \ /* precede args with ./ */ if ( sscanf(rq, \ return; if ( strcmp(cmd,\ cannot_do(fd); else if ( not_exist( arg ) ) do_404(arg, fd ); else if ( isadir( arg ) ) do_ls( arg, fd ); else if ( ends_in_cgi( arg ) )

36