资源描述:
《http服务器的设计与实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、网络课程设计实验报告题目:HTTP服务器的设计及实现姓名:孙宇飞、庄好涛、王斌学院:信息科学技术学院专业:计算机科学与技术班级:计科82班学号:1918215、1928216、1928209指导老师:叶锡君职称:副教授2011年9月11日南京农业大学教务处制15目录目录1.设计任务及要求11.1设计目的11.2设计要求12.工作原理及设计方案12.1工作原理12.2设计方案22.3开发环境22.4程序流程图22.5核心代码42.4.1主程序42.4.2请求处理函数52.4.3无法响应请求62.4.4404响应6152.
2、4.5判断是否是目录72.4.6判断文件是否存在72.4.8判断文件类型82.4.9执行CGI程序92.4.10判断请求的是否是cgi程序93.实验验证113.1实验设备及材料113.2实验步骤113.3实验截图113.4实验结果134.思考和总结13151.设计任务及要求1.1设计目的运用数据通信及网络课程所学的知识,设计一个简单的http服务器,在实现的过程中继续深入了解网络通信的原理,锻炼UNIX环境下网络编程的能力,熟悉socket编程原理和http协议,从而巩固所学网络知识。1.2设计要求1)要能实现get方
3、法;2)能响应请求的html页面;3)还能够响应请求的jpg的等图片文件;4)能响应请求的目录的信息,并以列表显示;2.工作原理及设计方案2.1工作原理HTTP协议工作流程:1.首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息:包括请求修饰符、客户机信息和可能的内容。 3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码
4、,后边是MIME信息包括服务器信息、实体信息和可能的内容。 4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客http工作流程图户机与服务器断开连接。 2.2设计方案协议版本号:使用HTTP1.015请求方法:仅实现get方法响应文件的类型:text/plain,image/gif,image/jpg,image/jpeg工作模式:多进程模式,每个进程单独处理一个请求。2.3开发环境VmwareWorkstation6.5虚拟机下FreeBSD环境,用C语言进行开发,开发工具包括:vim,gc
5、c,gdb。2.4程序流程图创建socket连接接收client连接读取client请求处理请求关闭socket循环图1.主程序15Fork()!=0退出YN响应501错误GET方法?NY请求对象存在?响应404错误YN请求对象为目录?响应目录信息YN请求对象为CGI交给CGI程序执行YN响应请求的文件返回图2.请求处理程序152.5核心代码2.4.1主程序intmain(intargc,char*argv[]){intsock,fd;FILE*fpin;charrequest[BUFSIZ];if(argc==1){
6、fprintf(stderr,"usage:webservport");exit(1);}/*创建socket连接*/sock=make_server_socket(atoi(argv[1]));if(sock==-1){exit(2);}/*主循环*/while(1){//接收socketfd=accept(sock,NULL,NULL);fpin=fdopen(fd,"r");//读取请求fgets(request,BUFSIZ,fpin);printf("gotacall:request=%s",reques
7、t);read_til_crnl(fpin);//处理请求process_rq(request,fd);//关闭socketfclose(fpin);15}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
8、%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)