http服务器的设计与实现.docx

上传人:b****7 文档编号:16300025 上传时间:2023-07-12 格式:DOCX 页数:19 大小:324.20KB
下载 相关 举报
http服务器的设计与实现.docx_第1页
第1页 / 共19页
http服务器的设计与实现.docx_第2页
第2页 / 共19页
http服务器的设计与实现.docx_第3页
第3页 / 共19页
http服务器的设计与实现.docx_第4页
第4页 / 共19页
http服务器的设计与实现.docx_第5页
第5页 / 共19页
http服务器的设计与实现.docx_第6页
第6页 / 共19页
http服务器的设计与实现.docx_第7页
第7页 / 共19页
http服务器的设计与实现.docx_第8页
第8页 / 共19页
http服务器的设计与实现.docx_第9页
第9页 / 共19页
http服务器的设计与实现.docx_第10页
第10页 / 共19页
http服务器的设计与实现.docx_第11页
第11页 / 共19页
http服务器的设计与实现.docx_第12页
第12页 / 共19页
http服务器的设计与实现.docx_第13页
第13页 / 共19页
http服务器的设计与实现.docx_第14页
第14页 / 共19页
http服务器的设计与实现.docx_第15页
第15页 / 共19页
http服务器的设计与实现.docx_第16页
第16页 / 共19页
http服务器的设计与实现.docx_第17页
第17页 / 共19页
http服务器的设计与实现.docx_第18页
第18页 / 共19页
http服务器的设计与实现.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

http服务器的设计与实现.docx

《http服务器的设计与实现.docx》由会员分享,可在线阅读,更多相关《http服务器的设计与实现.docx(19页珍藏版)》请在冰点文库上搜索。

http服务器的设计与实现.docx

http服务器的设计与实现

网络课程设计实验报告

目:

名:

院:

业:

级:

号:

HTTP服务器的设计及实现孙宇飞、庄好涛、王斌信息科学技术学院计算机科学与技术

计科82班

指导老师:

叶锡君

职称:

副教授

2011年9月11日

南京农业大学教务处制

1.设计任务及要求.............................................................................................................................1

1.1设计目的..............................................................................................................................1

1.2设计要求..............................................................................................................................1

2.工作原理及设计方案.....................................................................................................................1

2.1工作原理..............................................................................................................................1

2.2设计方案..............................................................................................................................2

2.3开发环境.............................................................................................................................2

2.4程序流程图..........................................................................................................................2

2.5核心代码.............................................................................................................................4

2.4.1主程序......................................................................................................................4

2.4.2请求处理函数..........................................................................................................5

2.4.3无法响应请求..........................................................................................................6

2.4.4404响应....................................................................................................................6

1

2.4.5判断是否是目录......................................................................................................7

2.4.6判断文件是否存在..................................................................................................7

2.4.8判断文件类型..........................................................................................................8

2.4.9执行CGI程序.........................................................................................................9

2.4.10判断请求的是否是cgi程序.................................................................................9

3.实验验证.......................................................................................................................................11

3.1实验设备及材料................................................................................................................11

3.2实验步骤............................................................................................................................11

3.3实验截图...........................................................................................................................11

3.4实验结果............................................................................................................................13

4.思考和总结...................................................................................................................................13

2

1.设计任务及要求

1.1设计目的

运用数据通信及网络课程所学的知识,设计一个简单的http服务器,在实现的过程中继续深入了解网络通信的原理,锻炼UNIX环境下网络编程的能力,熟悉socket编程原理和http协议,从而巩固所学网络知识。

1.2设计要求

1)要能实现get方法;

2)能响应请求的html页面;

3)还能够响应请求的jpg的等图片文件;

4)能响应请求的目录的信息,并以列表显示;

2.工作原理及设计方案

2.1工作原理

HTTP协议工作流程:

1.首先客户机与服务器需要建立连接。

只要单击某个超级链接,HTTP的工作就开始了。

2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:

统一资源标识符(URL)、协议版本号,后边是MIME信息:

包括请求修饰符、客户机信息和可能的内容。

  

3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

  

4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客http工作流程图户机与服务器断开连接。

  

2.2设计方案

协议版本号:

使用HTTP1.0

3

请求方法:

仅实现get方法

响应文件的类型:

text/plain,

image/gif,

image/jpg,

image/jpeg

工作模式:

多进程模式,每个进程单独处理一个请求。

2.3开发环境

VmwareWorkstation6.5虚拟机下FreeBSD环境,用C语言进行开发,开发工具包括:

vim,gcc,gdb。

2.4程序流程图

图1.主程序

4

 

Y

Y

N

N

N

Y

N

Y

N

图2.请求处理程序

5

2.5核心代码

2.4.1主程序

intmain(intargc,char*argv[])

{

intsock,fd;

FILE*fpin;

charrequest[BUFSIZ];

if(argc==1)

{

fprintf(stderr,"usage:

webservport\n");exit

(1);

}

/*创建socket连接*/

sock=make_server_socket(atoi(argv[1]));if(sock==-1)

{

exit

(2);

}

/*主循环*/

while

(1)

{

//接收socket

fd=accept(sock,NULL,NULL);

fpin=fdopen(fd,"r");

//读取请求

fgets(request,BUFSIZ,fpin);

printf("gotacall:

request=%s",request);read_til_crnl(fpin);

//处理请求

process_rq(request,fd);

//关闭socket

fclose(fpin);

6

}

return0;

}

2.4.2请求处理函数

intprocess_rq(char*rq,intfd)//加void会报警告不知道为什么?

{

charcmd[BUFSIZ],arg[BUFSIZ];

/*创建一个新进程,如果不是子进程则直接返回*/

if(fork()!

=0)

{

return-1;

}

strcpy(arg,"./");//加上./前缀

if(sscanf(rq,"%s%s",cmd,arg+2)!

=2)

{

return-1;

}

if(strcmp(cmd,"GET")!

=0)

{

cannot_do(fd);

}elseif(not_exist(arg))

{

do_404(arg,fd);

}elseif(isadir(arg))

{

do_ls(arg,fd);

}elseif(ends_in_cgi(arg))

{

do_exec(arg,fd);

}else

{

7

do_cat(arg,fd);

}

return0;

}/*-----endoffunctionprocess_rq-----*/2.4.3无法响应请求

intcannot_do(intfd)

{

FILE*fp=fdopen(fd,"w");

fprintf(fp,"HTTP/1.0501NotImplemented\r\n");fprintf(fp,"Content-type:

text/plain\r\n");

fprintf(fp,"\r\n");

fprintf(fp,"Thatcommandisnotyetimplemented\r\n");fclose(fp);

return0;

}/*-----endoffunctioncannot_do-----*/

2.4.4404响应

/*

*函数名:

do_404

*描述:

*参数:

*返回值:

*/

intdo_404(char*item,intfd)

{

FILE*fp=fdopen(fd,"w");

fprintf(fp,"HTTP/1.0404NotFound\r\n");

fprintf(fp,"Content-type:

text/plain\r\n");

fprintf(fp,"\r\n");

8

fprintf(fp,"Theitemyourequested:

%s\r\nisnotfound\r\n",item);fclose(fp);

return0;

}/*-----endoffunctiondo_404-----*/

2.4.5判断是否是目录

/*

*函数名:

isadir

*描述:

*参数:

*返回值:

*/

intisadir(char*f)

{

structstatinfo;

return(stat(f,&info)!

=-1&&S_ISDIR(info.st_mode));

}/*-----endoffunctionisadir-----*/

2.4.6判断文件是否存在

/*

*函数名:

not_exist

*描述:

*参数:

*返回值:

*/

intnot_exist(char*f)

{

structstatinfo;

return(stat(f,&info)==-1);

}/*-----endoffunctionnot_exist-----*/

2.4.7列出目录信息

/*

*函数名:

do_ls

9

*描述:

*参数:

*返回值:

*/

do_ls(char*dir,intfd)

{

FILE*fp;

fp=fdopen(fd,"w");

header(fp,"text/plain");

fprintf(fp,"\r\n");

fflush(fp);

dup2(fd,STDOUT_FILENO);

dup2(fd,STDERR_FILENO);

close(fd);

execlp("ls","ls","-l",dir,NULL);

perror(dir);

exit

(1);

}/*-----endoffunctiondo_ls-----*/2.4.8判断文件类型

/*

*函数名:

file_type

*描述:

返回文件后缀名

*参数:

*返回值:

*/

char*file_type(char*f)

{

char*cp;

if((cp=strrchr(f,'.'))!

=NULL){returncp+1;

10

}

return"";

}/*-----endoffunctionfile_type-----*/

2.4.9执行CGI程序

/*

*函数名:

do_exec

*描述:

*参数:

*返回值:

*/

intdo_exec(char*prog,intfd)

{

FILE*fp;

fp=fdopen(fd,"w");

header(fp,NULL);

fflush(fp);

dup2(fd,1);

dup2(fd,2);

close(fd);

execl(prog,prog,NULL);

perror(prog);

return0;

}/*-----endoffunctiondo_exect-----*/

2.4.10判断请求的是否是cgi程序

/*

*

*

*

*

函数名:

ends_in_cgi描述:

参数:

返回值:

11

*/

intends_in_cgi(char*f)

{

return(strcmp(file_type(f),"cgi")==0);

}/*-----endoffunctionends_in_cgi-----*/2.4.11返回请求的文件

/*

*函数名:

do_cat

*描述:

发送回包的主体,紧跟在http消息头后*参数:

*返回值:

*/

intdo_cat(char*f,intfd)

{

char*extension=file_type(f);

char*content="text/plain";

FILE*fpsock,*fpfile;

intc;

if(strcmp(extension,"html")==0)

{

content="text/html";

}elseif(strcmp(extension,"gif")==0)

{

content="image/gif";

}elseif(strcmp(extension,"jpg")==0)

{

content="image/jpeg";

}elseif(strcmp(extension,"jpeg")==0)

{

content="image/jpeg";

}

fpsock=fdopen(fd,"w");

fpfile=fopen(f,"r");

if(fpsock!

=NULL&&fpfile!

=NULL)

{

12

header(fpsock,content);

fprintf(fpsock,"\r\n");

while((c=getc(fpfile))!

=EOF)

{

putc(c,fpsock);

}

fclose(fpfile);

fclose(fpsock);

}

return0;

}/*-----endoffunctiondo_cat-----*/

3.实验验证

3.1实验设备及材料

局域网环境下,使用一台FreeBSD系统PC作为服务器,若干台PC作为客户机,使用IE浏览器请求服务器。

3.2实验步骤

1.启动服务器。

2.客户机在浏览器地址栏输入“服务器IP:

端口号/请求文件名”。

3.观察服务器响应的内容并记录。

3.3实验截图

1.启动服务器。

13

2.请求html文件

3.请求jpg文件

14

4.显示目录文件:

3.4实验结果

客户机请求后服务器后,能够正常显示所请求的网页、图片和目录的信息。

4.思考和总结

经过一星期的努力,我们的小型http服务器已经能够显示网页和图片了,并且能够返回当前目录的信息了,但是没有来得及加入CGI功能,在机房实验时因为网络的原因,没有演示成功,留下点遗憾。

但总体来说,这次课程设计还是让我们收获颇多:

首先,以前总觉得上网很神秘,在浏览器里点点鼠标,就能看到任何我们想看到的信息,后台到底做了哪些工作我们都不知道,而这次我们成功实现了一个小型的http服务器,能访问我们自己的网页,这种兴奋和成就感不言而喻;其次,在实现http服务器的过程中,我们熟悉了http协议等网络相关知识,巩固并实践了上学期网络课程所学内容;还有,我们又锻炼了UNIX环境下编程开发能力,并且领略了开源软件开发的魅力,为以后的工作打下了基础;最后,我们还会继续完善这个http服务器,使其功能越来越强大,也许我们以后就可以在我们自己的服务器上挂起自己的网站!

15

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2