http服务器的设计与实现.docx
- 文档编号:28642200
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:19
- 大小:324.20KB
http服务器的设计与实现.docx
《http服务器的设计与实现.docx》由会员分享,可在线阅读,更多相关《http服务器的设计与实现.docx(19页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- http 服务器 设计 实现