免费预览已结束,剩余3页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南师范大学综合性、设计性实验项目简介学院名称(公章):软件学院2012-2013学年第 一 学期 填表日期:2012年 9 月 18 日实验课程名称网络程序设计实验项目名称并发服务器端程序设计实验项目性质1、综合性 2、设计性主讲教师刘尚旺开课年级2011开课专业软件技术、网络技术实验地点过街楼实验室开课日期2012年9月10日至2013年1月16日开课时间12月5、12、19、26日上午8:00-9:40一、实验目的及要求1 选用多进程或多线程技术之一实现以下功能:服务器等待接收客户端的请求,一旦连接成功即显示客户端的IP地址及端口号,接着接收客户端的名称并加以显示;然后接收来自该客户端发送的字符串,每当收到一个字符串,即显示之,并将该字符串逆序后发回客户端;之后,继续等待接收该客户端的信息直到客户端关闭连接。2 掌握网络编程中使用多进程与多线程设计并发服务器的异同点。3 掌握wait()和waitpid()函数的区别。该实验分4次完成,每组1人。第1次:完成并发服务器端程序的主框架设计,进行调试,验证其正确性;(2学时)第2次:完成并发服务器端程序的调试,并验证其正确性;(2学时)第3次:详细设计,进行调试,验证其正确性;(2学时)第3次:进行整体调试,运行程序,验证其正确性,完成实验报告。(2学时) 该实验能巩固和加深课堂教学内容,能提高学生利用网络编程模拟仿真解决实际问题的能力, 主要培养学生的组织能力与科学作风。这对学习其它课程及从事工程实践都有所帮助。2、 实验环境 操作系统:Fedora 12Linux内核:2.6.31.5-127.fc12.i6863、 服务器并发策略 设计并发策略的目的就是就是让IO操作和CPU计算尽量重叠进行。一方面要让CPU在IO等待不要空闲,另一方面要让CPU在IO调度上尽量花最少的时间。 (1)一个进程处理一个连接,非阻塞IO这样会存在多个并发请求同时到达时,服务器必然要准备多个进程来处理请求。这种策略典型的例子就是Apache的fork和prefork模式。对于并发数不高的站点同时依赖Apache其它功能时的应用选择Apache还是可以的。 (2)一个线程处理一个连接,非阻塞IO这种方式允许在一个进程中通过多个线程来处理多个连接,一个线程处理一个连接。Apache的worker模式就是这种典型例子,使其可支持更多的并发连接。不过这种模式的总体性能还不如prefork,所以一般不选用worker模式。 (3)一个进程处理多个连接,非阻塞IO适用的前提条件就是多路IO就绪通知的应用。这种情况下,将处理多个连接的进程叫做worker进程或服务进程。worker的数量可以配置,如Nginx中的worker_processes 4 (4)一个线程处理多个连接,异步IO即使有高性能的多路IO就绪通知,但磁盘IO的等待还是无法避免的。更加高效的方法是对磁盘文件使用异步IO,目前很少有Web服务器真正意义上支持这种异步IO。4、 实验步骤 服务器端程序:#include #include #include #include #include #include #define MAXLINE 4096int main( int argc , char * * argv )int listenfd , connfd;struct sockaddr_in servaddr;char sendBuff MAXLINE , recvBuff MAXLINE ;time_t ticks;pid_t pid;listenfd = socket( AF_INET , SOCK_STREAM , 0 );memset( &servaddr , 0 , sizeof( servaddr ) );servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl( INADDR_ANY );servaddr.sin_port = htons( 10023 );/端口:10023 无法使用23号端口bind( listenfd , (struct sockaddr *)&servaddr , sizeof( servaddr ) );listen( listenfd , 1024 );int i = 0;for( ; ; )printf(Start!n);connfd = accept( listenfd , (struct sockaddr *)NULL , NULL );printf(Client ID: %dn,i);/记录连接客户数量if( (pid = fork() = 0 )/多进程close( listenfd );sendBuff0 = 0Xff;sendBuff1 = 0Xfb;sendBuff2 = 0X01;/Will Echo 命令sendBuff3 = 0Xff;sendBuff4 = 0Xfb;sendBuff5 = 0X03;/Will Suppress Go Ahead 命令write( connfd , sendBuff , 6 );read( connfd, recvBuff, MAXLINE );/读取回传值,本实验中丢弃ticks = time( NULL );snprintf( sendBuff , sizeof( sendBuff ) , rnWelcome to 10023 port Telnet Server!rnTime of server: %.24srn , ctime( &ticks ) );write( connfd , sendBuff , strlen( sendBuff ) );/发送欢迎信息snprintf( sendBuff , sizeof( sendBuff ) , Username:0 );write( connfd , sendBuff , strlen( sendBuff ) );/发送Username:for( ; ; )ssize_t n = read( connfd, recvBuff, MAXLINE );if( recvBuff0 != 0Xff )/本实验中丢弃其他命令if( recvBuff0 = r )/输入用户名时,遇到回车结束break;write( connfd , recvBuff , n );/回传原字符snprintf( sendBuff , sizeof( sendBuff ) , rnPassword: );write( connfd , sendBuff , strlen( sendBuff ) );/发送Password:for( ; ; )ssize_t n = read( connfd, recvBuff, MAXLINE );if( recvBuff0 = r )/输入密码时,遇到回车结束break;snprintf( sendBuff , sizeof( sendBuff ) , * );write( connfd , sendBuff , n );/回传*snprintf( sendBuff , sizeof( sendBuff ) , rnAuthenticated!rnGoodbye!rnrn );write( connfd , sendBuff , strlen( sendBuff ) );/发送结束信息close( connfd );exit(0);+i;close( connfd );客户端程序:#include #include #include #include #include #define MAXLINE 4096int main( int argc , char * * argv )int sockfd , n ;char sendBuff MAXLINE , recvBuff MAXLINE ;struct sockaddr_in servaddr;if( argc != 2 )printf( usage : TelnetClient n );exit( 1 );if( ( sockfd = socket( AF_INET , SOCK_STREAM , 0 ) ) 0 )printf( socket errorn );exit( 1 );memset( &servaddr , 0 , sizeof( servaddr ) );servaddr.sin_family = AF_INET;servaddr.sin_port = htons( 10023 );/连接端口:10023 if( inet_pton( AF_INET , argv 1 , &servaddr.sin_addr ) = 0 )printf( inet_pton error for %sn , argv 1 );exit( 1 );if( connect( sockfd , (struct sockaddr *)&servaddr , sizeof( servaddr ) ) 0 )char temp = 0Xff;recvBuff n = 0;if( recvBuff0 != temp )/是命令则回送,不是命令则显示printf( recvBuff );fflush( stdout );/强制输出接收的字节elsewrite( sockfd , recvBuff , n );+i;if( i = 3 )/简陋的客户端,知道服务器传送的顺序,从第4次开始要求输入system( stty raw -echo );/系统调用raw:响应单个字节的键盘输char c = getchar();/入而无需等待“n”进入输入缓冲区;system( stty -raw echo );/-echo:取消键盘输入回显。sendBuff0 = c;write( sockfd , sendBuff , 1 );/单字节传送用户名和密码if( n 0 )printf( read errorn );exit( 1 );exit( 0 );5、 实验结果及分析使用标准Telnet命令的服务器端可以与系统现有的Telnet程序进行正常交互:Linux内置的Telnet客户端连接情况Windows内置的Telnet客户端连接情况采用并发设计服务端程序对于多用户连接也是工作正常的:相应的客户端端程序可以正确与服务器交互(不过客户端还是很简陋的,还没有通用性):1、UNIX(Linux)中,终端输入在缺省情况下是被“一锅端”的,也就是说整行输入是被一起处理的。它意味着在读入数据时必须按一下回车键表示输入行结束后才能得到输入的数据。为了得到对每一个键盘输入的相应,我采用了system( stty raw -echo )来开启终端驱动的一次一字符模式。2、由于发送缓冲区的存在,每次write之后数据不是立刻发送到对方的,可能是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省济宁市2025-2026学年物理高二第一学期期末统考模拟试题含解析
- 河北省衡水市故城县高级中学2025-2026学年高一上物理期末调研模拟试题含解析
- 宠物市场消费趋势及服务需求调查
- 防水卷材浸水后质量增加试验记录
- 毕设排版要求范文
- 施工材料管理制度15
- 10汉语言学年论文模板
- 《企业成本控制现状及其改进对策-以方太厨电为例》开题报告含提纲
- 自-数学教育专业本科毕业论文参考题目
- 本科审计学专业毕业论文题目审计专业参考选题
- 保洁公司开荒保洁合同
- 【胸部】胸部病变的CT诊断课件
- 2025年12月日历表(含农历-周数-方便记事备忘)
- 高速公路雾天、冰雪路面应急处理预案(4篇)
- 企业员工廉洁教育培训
- 浙教版七年级上册英语单词表
- 设备安装专项施工方案
- 幕墙作业安全技术交底
- 雾化吸入知识宣教主题班会课件
- 管理评审报告-2020年ISO27001-信息安全管理体系
- DL∕T 1564-2016 垂线装置 标准
评论
0/150
提交评论