http服务器的设计与实现(共16页).doc

上传人:飞****2 文档编号:14158539 上传时间:2022-05-03 格式:DOC 页数:16 大小:525KB
返回 下载 相关 举报
http服务器的设计与实现(共16页).doc_第1页
第1页 / 共16页
http服务器的设计与实现(共16页).doc_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《http服务器的设计与实现(共16页).doc》由会员分享,可在线阅读,更多相关《http服务器的设计与实现(共16页).doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上网络课程设计实验报告题 目: HTTP服务器的设计及实现 姓 名: 孙宇飞、庄好涛、王斌 学 院: 信息科学技术学院 专 业: 计算机科学与技术 班 级: 计科82班 学 号: 、 指导老师: 叶锡君 职称: 副教授 2011 年 9 月 11 日南京农业大学教务处制目录目录1.设计任务及要求1.1设计目的运用数据通信及网络课程所学的知识,设计一个简单的http服务器,在实现的过程中继续深入了解网络通信的原理,锻炼UNIX环境下网络编程的能力,熟悉socket编程原理和http协议,从而巩固所学网络知识。1.2设计要求1) 要能实现get方法;2) 能响应请求的htm

2、l页面;3) 还能够响应请求的jpg的等图片文件;4) 能响应请求的目录的信息,并以列表显示;2.工作原理及设计方案2.1工作原理HTTP协议工作流程:1.首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息:包括请求修饰符、客户机信息和可能的内容。 3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。 4.客户端接收服务器所返回的信息通过浏览

3、器显示在用户的显示屏上,然后客http工作流程图户机与服务器断开连接。 2.2设计方案协议版本号:使用HTTP 1.0请求方法:仅实现get方法响应文件的类型:text/plain,image/gif,image/jpg,image/jpeg工作模式:多进程模式,每个进程单独处理一个请求。2.3 开发环境Vmware Workstation 6.5 虚拟机下FreeBSD环境,用C语言进行开发,开发工具包括:vim,gcc,gdb。2.4程序流程图创建socket连接接收client连接读取client请求处理请求关闭socket循环 图1.主程序Fork() != 0退出YN响应501错误G

4、ET方法?NY请求对象存在?响应404错误YN请求对象为目录?响应目录信息YN请求对象为CGI交给CGI程序执行YN响应请求的文件返回图2.请求处理程序2.5 核心代码2.4.1 主程序int main ( int argc, char *argv ) int sock, fd; FILE *fpin; char requestBUFSIZ; if ( argc = 1 ) fprintf( stderr, usage: webserv portn ); exit(1); /* 创建socket连接 */ sock = make_server_socket( atoi( argv1 ) );

5、if ( sock = -1) exit(2); /* 主循环 */ while( 1 ) /接收socket fd = accept( sock, NULL, NULL ); fpin = fdopen ( fd, r ); /读取请求 fgets( request, BUFSIZ, fpin ); printf( got a call: request = %s,request ); read_til_crnl( fpin ); /处理请求 process_rq( request, fd ); /关闭socket fclose( fpin ); return 0;2.4.2 请求处理函数i

6、nt process_rq ( char *rq, int fd)/加void会报警告不知道为什么? char cmdBUFSIZ, argBUFSIZ; /* 创建一个新进程,如果不是子进程则直接返回 */ 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 ); else if ( not_exist ( arg ) do_404( arg,

7、 fd ); else if ( isadir ( arg ) ) do_ls( arg, fd ); else if (ends_in_cgi ( arg ) ) do_exec( arg, fd ); else do_cat( arg, fd ); return 0;/* - end of function process_rq - */2.4.3 无法响应请求int cannot_do ( int fd ) FILE *fp = fdopen( fd, w ); fprintf( fp, HTTP/1.0 501 Not Implementedrn ); fprintf( fp, Con

8、tent-type: text/plainrn ); fprintf( fp, rn ); fprintf( fp, That command is not yet implementedrn ); fclose( fp ); return 0;/* - end of function cannot_do - */2.4.4 404响应/* * 函数名: do_404 * 描述: * 参数: * 返回值: */int do_404 ( char *item, int fd ) FILE *fp = fdopen( fd, w ); fprintf( fp, HTTP/1.0 404 Not F

9、oundrn ); fprintf( fp, Content-type: text/plainrn ); fprintf( fp, rn ); fprintf( fp, The item you requested: %srnis not foundrn , item); fclose( fp ); return 0;/* - end of function do_404 - */2.4.5 判断是否是目录/* * 函数名: isadir * 描述: * 参数: * 返回值: */int isadir ( char *f ) struct stat info; return ( stat( f

10、, &info ) != -1 & S_ISDIR(info.st_mode) );/* - end of function isadir - */2.4.6 判断文件是否存在/* * 函数名: not_exist * 描述: * 参数: * 返回值: */int not_exist ( char *f ) struct stat info; return ( stat( f, &info ) = -1 );/* - end of function not_exist - */2.4.7 列出目录信息/* * 函数名: do_ls * 描述: * 参数: * 返回值: */do_ls ( ch

11、ar *dir, int fd ) FILE *fp; fp = fdopen( fd, w ); header( fp, text/plain ); fprintf( fp, rn ); fflush( fp ); dup2( fd, STDOUT_FILENO ); dup2( fd, STDERR_FILENO ); close( fd ); execlp( ls, ls, -l, dir, NULL); perror( dir ); exit( 1 );/* - end of function do_ls - */2.4.8 判断文件类型/* * 函数名: file_type * 描述

12、: 返回文件后缀名 * 参数: * 返回值: */char * file_type ( char *f ) char *cp; if ( ( cp = strrchr( f, . ) ) != NULL ) return cp+1; return ;/* - end of function file_type - */2.4.9 执行CGI程序/* * 函数名: do_exec * 描述: * 参数: * 返回值: */int do_exec ( char *prog, int fd ) FILE *fp; fp = fdopen( fd, w ); header( fp, NULL ); f

13、flush( fp ); dup2( fd, 1 ); dup2( fd, 2 ); close( fd ); execl( prog, prog, NULL ); perror( prog ); return 0;/* - end of function do_exect - */2.4.10 判断请求的是否是cgi程序/* * 函数名: ends_in_cgi * 描述: * 参数: * 返回值: */int ends_in_cgi ( char *f ) return ( strcmp( file_type( f ), cgi ) = 0 );/* - end of function e

14、nds_in_cgi - */2.4.11 返回请求的文件/* * 函数名: do_cat * 描述: 发送回包的主体,紧跟在http消息头后 * 参数: * 返回值: */int do_cat ( char *f, int fd ) char *extension = file_type( f ); char *content = text/plain; FILE *fpsock, *fpfile; int c; if ( strcmp(extension, html ) = 0 ) content = text/html; else if ( strcmp( extension, gif)

15、 = 0 ) content = image/gif; else if ( strcmp( extension, jpg ) = 0 ) content = image/jpeg; else if ( strcmp( extension, jpeg ) = 0 ) content = image/jpeg; fpsock = fdopen( fd, w ); fpfile = fopen ( f, r ); if ( fpsock != NULL & fpfile != NULL ) header( fpsock, content ); fprintf( fpsock,rn ); while(

16、 ( c = getc( fpfile) ) != EOF ) putc( c, fpsock ); fclose( fpfile ); fclose ( fpsock ); return 0;/* - end of function do_cat - */3.实验验证3.1实验设备及材料局域网环境下,使用一台FreeBSD系统PC作为服务器,若干台PC作为客户机,使用IE浏览器请求服务器。3.2实验步骤1.启动服务器。2.客户机在浏览器地址栏输入“服务器IP:端口号/请求文件名”。3.观察服务器响应的内容并记录。3.3 实验截图1.启动服务器。2.请求html文件3.请求jpg文件4.显示目

17、录文件:3.4实验结果客户机请求后服务器后,能够正常显示所请求的网页、图片和目录的信息。4.思考和总结经过一星期的努力,我们的小型http服务器已经能够显示网页和图片了,并且能够返回当前目录的信息了,但是没有来得及加入CGI功能,在机房实验时因为网络的原因,没有演示成功,留下点遗憾。但总体来说,这次课程设计还是让我们收获颇多:首先,以前总觉得上网很神秘,在浏览器里点点鼠标,就能看到任何我们想看到的信息,后台到底做了哪些工作我们都不知道,而这次我们成功实现了一个小型的http服务器,能访问我们自己的网页,这种兴奋和成就感不言而喻;其次,在实现http服务器的过程中,我们熟悉了http协议等网络相关知识,巩固并实践了上学期网络课程所学内容;还有,我们又锻炼了UNIX环境下编程开发能力,并且领略了开源软件开发的魅力,为以后的工作打下了基础;最后,我们还会继续完善这个http服务器,使其功能越来越强大,也许我们以后就可以在我们自己的服务器上挂起自己的网站!专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁