欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    并发服务器端程序设计实验报告.docx

    • 资源ID:5282233       资源大小:162.32KB        全文页数:8页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    并发服务器端程序设计实验报告.docx

    河南师范大学综合性、设计性实验项目简介学院名称(公章):软件学院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学时)该实验能巩固和加深课堂教学内容,能提高学生利用网络编程模拟仿真解决实际问题的 能力,主要培养学生的组织能力与科学作风。这对学习其它课程及从事工程实践都有所帮 助。二、实验环境操作系统:Fedora 12Linux 内核:2.6.31.5-127.fc12.i686三、服务器并发策略设计并发策略的目的就是就是让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的等待还是无法避免的。更加高效的方法是对 磁盘文件使用异步。,目前很少有Web服务器真正意义上支持这种异步IO。四、实验步骤服务器端程序:#include <stdio.h>#include <string.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/time.h>#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 <stdio.h>#include <string.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/socket.h>#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 <IP address>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 );/连接端口: 10023if( 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 )printf( "connect errorn");exit( 1 );int i = 0;while( ( n = read( sockfd , recvBuff , MAXLINE ) ) > 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 );五、实验结果及分析使用标准Telnet命令的服务器端可以与系统现有的Telnet程序进行正常交互:Linux内置的Telnet客户端连接情况Windows内置的Telnet客户端连接情况采用并发设计服务端程序对于多用户连接也是工作正常的:DXEtansoxstar Debug? -/Telmet5erver Start!Client ID: 6StartClient ID: 1StartCliient ID; 2StartnClient ID: 3StartClient ID: 4StartCUf&nt ID; 5Start0nr室件任)痢旧近*W ®WI)袖助旧,rojts-Trox&rai' iQinig Csannected Escape chsEH<?JiStdir ;-址1花匚1&.3交件心 啪© 登否凹s?m(n 喘邸小hielcDoe cd Tine M 沱 Userndhe:oxstngoKst-sr Trying 1&, Lannecied E&cdpe thatelnet ig 3,4,173 igez?缰曲El *#;¥!停,S吨助叫Wei cone to Tine of sc Userriane:QMstargQx:5teirTrying 16,"CcnnectedEscape chdWbLcohe tc Tint- gf 皿 Uscirn.anc-ri|口|回I魅I次件旧 潮坦 a«M ewp 菲晰hi室件理)疵旧互耐爵知*D 袖HWH)MeLeah td Tine cT 巽tutscareojtgr § wins S341巧 河23Trying ID.'ConnectedEscape chahelcaie m 123 part TeLnet Server liae M tervei: Tht Dec 3 20:5«:28 1 白圆 usernane:oxtTar0o>&tai' -s t&Lnet 16.3.-173 1的【3TTyinpg 16.3. 4-173Connected 加 1Q.3.L73.Ecap character is ,rt ,OXStAfOKSt3项皿汕 -% 或E4】T 1腿电Irying 抽-CanfleetedEscape diaweRow to line of 5C Usernane:相应的客户端端程序可以正确与服务器交互(不过客户端还是很简陋的,还没有通用 性):1、UNIX(Linux)中,终端输入在缺省情况下是被“一锅端”的,也就是说整行输入 是被一起处理的。它意味着在读入数据时必须按一下回车键表示输入行结束后才能得到输入 的数据。为了得到对每一个键盘输入的相应,我采用了 system( "stty raw -echo")来开 启终端驱动的一次一字符模式。2、由于发送缓冲区的存在,每次write之后数据不是立刻发送到对方的,可能是将多 次write的数据一起送达,这就对数据过滤造成了一些麻烦。Telnet交互类似于一种状态机 模式,假如要写出健壮的程序就只好对数据包的每个字节进行分析了。六、实验心得万事开头难,网络编程没什么好害怕的,不要总以为自己什么都不会,如果不去尝试, 那么自己就真的什么都不会了。在做实验的开始,也许我们会遇到各种各样的困难,但是不 要气馁,方法总比困难多。只要我们坚持不懈努力,就一定可以取得成功。注:开课时间填本实验项目所有实验班的具体上课时间,如11月12日下午3: 00-5: 00。

    注意事项

    本文(并发服务器端程序设计实验报告.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开