网络软件设计6-多路复用_第1页
网络软件设计6-多路复用_第2页
网络软件设计6-多路复用_第3页
网络软件设计6-多路复用_第4页
网络软件设计6-多路复用_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络软件设计多路通信与select()阻塞与非阻塞机制制作主讲1多路通信问题的提出(一)标准服务器流程listen(s,5);……while(1){newsock=accept(s,…);recv(newsock,buf1,…);send(newsock,buf2,…);processbuf1;preparebuf2;closesocket(newsock);}while(recv(newsock,buf1,…)>0){}

虽然在服务器一端已有多个已建立连接的套接字,但服务器流程限制了每次只能对一个连接进行操作,需要一种机制能使服务器程序同时操作多条连接ASectionofCOServer2多路通信问题的提出(二)利用标准流程建立的一个聊天程序框架connect(s,……);……while(1){recv(s,rcvBuf,…);send(s,sndBuf,…);printf(“%s”buf2)closesocket(newsock);}}受流程限制,必须要读到键盘数据,才能发送,才能接收对方的数据;必须收到对方的数据后,才能等待键盘输入数据。需要一种机制能使程序同时等待多个事件。ASectionofCOClientscanf(”%s”,sndBuf);客户机流程3多路通信设计什么叫多路通信/多路复用?多条连接上的数据同时通信什么叫“同时”?同一时刻并行同一时间并发:在一段时间内同时发生一段时间究竟有多长?通信领域:从通信的开始到通信的结束从建立连接到关闭连接4多路通信设计怎样同时通信?“感觉”上的同时,因为实际上还是只有一只“笔”任务队列逐个处理各任务的事件,注意不是以任务为单位,而是以事件为单位从总体时间看,在一段时间内“同时”处理了多个任务的事件任务拆分成各个事件将整个一个通信连接过程看做一个任务将每次数据交换看做一个事件。所以所谓多路通信的实质就是串并转换。5select()功能设计:该函数能检查多个套接字的状态,服务器程序就可以根据这些信息做出相应的处理输入:套接字队列将希望多路操作的一组套接字排成队列输出:各待查套接字当前的状态如:是否有数据到达,是否需要关闭等6Select()程序框架多路复用的程序基本框架技术难点makethesockets_listwhile(1){select(sockets_list);逐个检查队列中的套接字状态;不同的状态作出相应的处理;}for(i=0;i<n;i++){getasocketfromlist;switch(socketstate){caseRECV:recv(socket,data);process(data);caseCLOSE:closesocket(socket);}}套接字队列和状态表示怎么建立队列怎么表示状态7多路复用程序设计关键技术关键技术:套接字队列状态表示与处理8关键技术:套接字队列1、套接字队列2、套接字队列的操作初始化、插入、删除、查找、遍历等typedefstructfd_set{u_intfd_count;SOCKETfd_array[FD_SETSIZE];}fd_set;fd_count:队列中有多少个套接字;fd_array:套接字队列Windows自带标准结构体9关键技术:套接字队列套接字接口提供了一些专门的操作实现套接字队列的插入、删除和查找等功能初始化FD_ZERO(*set)--初始化套接字队列-set插入FD_SET(s,*set)--将套接字s插入到队列set中删除FD_CLR(s,*set)--从队列set中删除套接字s查找FD_ISSET(s,*set)--查找s是否在队列set中例10关键技术:套接字队列除了“查询套接字”队列,我们还需要建立自己套接字队列--套接字管理队列为什么?1、查询套接字队列内容在每次select后会动态变化2、我们需要一个完整的队列以便每次能保证检索所有的“在线”套接字怎么做?makethesockets_listwhile(1){select(sockets_list);for(i=0;i<n;i++){getasocketfromlist;switch(socketstate){caseRECV:recv(socket,data);process(data);caseCLOSE:closesocket(socket);}}}11关键技术:套接字队列自己的套接字管理队列怎么做?定义操作:init()、insert()、delete()make_fdlist(),fromourlisttosocketliststructsocket_list{ SOCKETMainSock; intnum; SOCKETsock_array[64];};fd_set—查询套接字队列监听套接字通信套接字12多路复用程序设计关键技术3、状态表示用逐个标识方式--标志:为每个套接字设置标志位,表明所处状态用分类处理方式--状态队列:具有某个状态的套接字进入到相应的状态队列中状态类别名字含义读状态readfds套接字在读状态队列中,表示该套接字收到远方数据写状态writefds表示套接字已准备好,用户可以向套接字发送数据意外状态exceptfds意外情况例13多路复用程序设计关键技术socket的状态不止这三种,有些状态在适当的时候利用三种基本状态的一种表现出来。例如:读状态当套接字先前处于listen(),读状态意味者在这个套接字上有了新的连接(或者说可以在这个套接字上接受连接)写状态当套接字先前处于connect()--申请连接远端,写状态意味着与远方的连接已经建立意外状态当套接字先前处于connect()--申请连接远端,其它状态意味着与远方的连接已经失败例例例14select()intselect(INintnfds,INOUTfd_set*readfds,INOUTfd_set*writefds,INOUTfd_set*exceptfdsINstructtimeval*timeout)intnfds:忽略readfds、writefds、exceptfds:三个状态队列功能:调用select时,三个队列中的套接字表示要求系统检查的套接字集合,调用select后,系统将这些集合中真正具有相应状态的套接字保留在队列里,不具有状态的套接字从队列中删除timeval*timeout:select操作完成的时限时限的作用,减少查询空闲套接字的频繁程度返回:满足条件的套接字总数量三个套接字类型的队列15输入、输出多路复用引入了select机制的多路复用程序框架makethethreestatuslistwhile(1){select(0,readfds,writefds,exceptfds,NULL);}for(i=0;i<n;i++){makeasocket_list;所有多路复用的套接字集合getasocketsformsocket_list;(onebyone)if(FD_ISSET(s,readfds))dorecv()oraccept();if(FD_ISSET(s,writefds))dosend(data);if(FD_ISSET(s,exceptfds))closesocket(s);}思考:如果所有的通信都很少活动,怎样将轮询的次数降下来?16事件驱动的机制基于select的程序可以认为是具有事件驱动特点的机制select可看作是事件发生器得到事件后进行分发处理select()switch()case1case2casen17事件驱动的机制在select的事件中最重要的是:接收数据事件--读事件有读事件发生,则从套接字读出数据发送数据事件--写事件有写事件发生,则向套接字发送数据???18case1case2事件驱动的机制“标准”的事件驱动流程recv(data)processdataselect()switch()读事件organizedatasend(data)写事件19仔细一想,问题出现了事件驱动模型上:发生可写事件,对应于发送数据业务模型上:“读”和“写”的驱动机制是不一样的。用户“读”是被动的是先有数据可读,然后才能够正确的读用户“写”是主动的表面上,是先可写,然后才能够写但是,写还有个前提:有数据可写产生可写的数据,是用户程序主动产生的“产生可写的数据”,不是由“可写”这个事件驱动的——想要说话,不是由电话“接通”触发的20事件驱动的机制“写事件”不是想象中的“写事件”写事件的正确含义——当写事件发生时,表示套接字已经准备好,可以向外发送数据了不是先有写事件,才发送数据--即:不是看见电话可以用,我们就要打一通电话而是:先有发送数据的需要,再向系统询问是否可以发送数据,系统给出发送数据事件后,我们才发送数据。此外,没有数据需要发送时,也就不会去关心套接字是否可以发送21case1case2事件驱动的机制发送流程在观念上的转变:recv(data)processdatawanttosendsomethingorganizesendingDataFD_SET(s,&writefds)select()switch()读事件send(sendingData)FD_CLR(s,&writefds)写事件22事件驱动的机制关于写事件的另外一个角度:写不动问题简单的处理方法:想发就发例:产生可写数据,往往是因对方数据的处理的结果,因此可以在处理完对方的数据后,直接发送。后续问题:当发生系统发送速度慢,造成发送不能成功时,仍然需要等待可写事件——即,不能阻塞等待,也不能不阻塞(不断尝试发送)而使系统更加繁忙。recv(data)processdatawantsendsometingsend(someting)23上机1、编写具有select机制的服务器,可同时与多个客户机程序通信2、通过程序调试感受从阻塞机制到非阻塞机制的变化对任务的具体要求:客户机每从键盘收到一串字符就发送给服务器服务器,收到客户机的数据后打印到屏幕,并回送一个应答信息客户机收到用户敲入的“exit”后,退出。服务器使用select()同时接收多个用户的需求客户机收到服务器的应答后,等待用户键盘输入思考:1、如果用无连接(UDP)方式,如何实现以上任务是无连接服务程序复杂还是面向连接服务程序复杂

2、在客户机程序中使用select,将实现什么功能24多路复用程序演示套接字管理队列的定义,及相关操作设置套接字为非阻塞状态建立多路复用程序框架完成逐个检查套接字状态、并处理的过程,注意对主套接字的单独处理对比实验:非多路复用机制的程序25网络软件设计阻塞与非阻塞机制26阻塞与非阻塞阻塞当要求的系统服务得到满足时才返回的调用例:recv(s,buffer,……);当远端有数据送来时才“返回”非阻塞:无论系统服务是否能立即完成,系统调用都立即返回例:recv(s,buffer,……);并不等到对方数据送来才返回,无论套接口的so_rev队列是否有数据,非阻塞的recv都将立刻返回27阻塞与非阻塞回顾socket接口的队列机制socketso_qso_rcvso_sndASectionofCOserverlisten(s,5);……while(1){newsock=accept(s,…);send(newsock,buf2,…);processbuf1;preparebuf2;closesocket(newsock);}while(recv(newsock,buf1,…)>0){}当so_q中没有已建立连接的套接字时阻塞当接收队列中没有数据时阻塞阻塞会导致后续程序无法执行,但不阻塞,后续程序执行会错误28阻塞与非阻塞主要的套接字函数中具有阻塞状态的有:socket()bind()listen()accept()recv()send()closesocket()recvfrom()sendto()connect()select()setsockopt()ioctlsocket()shutdown()通信类控制类getpeername()getsockname()getsockopt()信息类htonl()htons()ntohl()ntohs()inet_addr()inet_ntoa()辅助类29阻塞与非阻塞的设置系统在执行一个套接字函数时,如何知道是否应该阻塞?根据套接字状态阻塞态套接字非阻塞态套接字如何设置套接字状态?在ioctlsocket()中设置FIONBIO,指定套接字状态30阻塞与非阻塞的设置例:设置套接字为阻塞态例:设置套接字为非阻塞态longarg;arg=0;ioctlsocket(s,FIONBIO,&arg);实验感受longarg;ioctlsocket(s,FIONBIO,&arg);arg=1;操作对象干什么怎么干套接字的默认状态为阻塞态31阻塞与非阻塞对程序设计的影响网络软件设计中常遇到等待对方配合的现象等,还是不等?--阻塞还是不阻塞?这是个问题!等可能造成“等”此失彼--多路复用机制失效不等!容易形成“忙等”--浪费CPU资源32阻塞socketso_qso_rcvso_snd……while(1){send(newsock,buf2,…);processbuf1;preparebuf2;}while(recv(newsock,buf1,…)>0){}套接字函数的阻塞对多路复用技术可能造成阻碍FD_SET(s,&readfds);if(select(0,&readfds,0,0,&tmo)>=0){if(FD_ISSET(s,&readfds)){}如果recv阻塞,多路复用就失去了意义FD_SET(ss,&readfds);if(FD_ISSET(ss,&readfds)){…}}实验证明33recv(s1,)处理数据准备接收新数据关闭连接END收到出错select()…………阻塞方式的一般流程阻塞流程某事件处理的阻塞影响了对其它事件的处理recv(s2,)34非阻塞方式的一般流程recv处理数据准备接收新数据关闭连接END收到出错没有容易陷入忙等循环select()…………非阻塞流程35非阻塞对系统效率的影响实验实验目的:验证非阻塞方式下容易“忙等”,造成系统效率下降实验原理及方法:

在套接字基本不活动的环境下,通过对比系统在执行设置了不同的select超时值的程序的CPU活动情况,可以获得结论利用windows任务管理器的性能图,观察CPU活动情况实验步骤:1、设置timeout值为0秒,记录CPU的利用率2、设置timeout值为1秒,记录CPU的利用率3、设置timeout值为1微秒,记录CPU的利用率实验记录:略实验结论思考:如何解释1微秒时,系统利用率为1%?实验方法36select采用设置阻塞时限的方式在阻塞和非阻塞间进行了平衡recv处理数据准备接收新数据关闭连接END收到出错没有timeout的取值减轻了忙等select(…,timeout)…………NULLselect的超时机制timeout:放入0忙等放入非零值等待相应时间放入空指针完全阻塞37structtimeval{longtv_sec;/*seconds*/longtv_usec;/*andmicroseconds*/微秒us};设置select()时间如:要设置为1.5秒structtimevaltmo;tmo.tv_sec=tmo.tv_usec=1;500000;如:设置为0秒,即不等待tmo.tv_sec=tmo.tv_usec=0;0;select(…,&tmo);38阻塞与非阻塞对程序设计的影响1、程序执行效率和功能阻塞CPU利用率最高程序不具备多路复用功能非阻塞会浪费CPU多做无谓的判断程序可同时处理多个事件39阻塞与非阻塞对程序设计的影响2、流程可能不同阻塞:非阻塞:recv()处理收到的数据关闭连接或recv()处理收到的数据关闭连接可能没收到数据,应该继续做其它事,然后再尝试接收或再次尝试时如何保证能接续之前暂停的工作40阻塞与非阻塞对程序设计的影响3、事件处理方式可能不同部分函数执行结果不同,如recv()阻塞返回值大于0:表示有数据收到返回值等于0:表示对方关闭连接返回值为-1:表示连接意外中断--RST非阻塞返回值为-1:可能表示这次没有收到数据retval=recv(s,….);If(retval==-1){retval=WSAGetLastError()if(retval==WSAEWOULDBLOCK)means当前无数据}41阻塞与非阻塞小结阻塞与否是套接字的状态阻塞与否与具体任务要求及设计流程有关简单设计时,让套接字阻塞复杂设计时,套接字为非阻塞,通过select的timeout参数在阻塞和非阻塞之间找寻平衡点。同时应考虑数据缓冲和工作流控制,以备接续暂停的工作所需阻塞与否还将影响程序编写的细节如对recv等函数返回值的处理towaitornot,isaproblem……42通信程序框架小结除了四种基本流程外,在通信程序的框架设计上常有以下讨论:多路复用与非多路复用服务器同时为多个客户提供服务并发服务基于select的重复服务服务器只能为一个客户提供服务重复服务与并发服务仅使用一个进程(线程)利用循环,依次为客户提供通信服务非多路复用的重复服务基于select的重复服务使用多个线程并发推进提供通信服务并发服务43通信程序框架小结非多路复用的重复服务s=socket(SOCK_STREAM);bind(s,…);listen(s,5);while(1){ns=accept(s,…);recv(ns,…);send(ns,…);closesocket(ns);}closesocket(s);44通信程序框架小结基于select的具有多路复用的重复服务while(1){}while(recv(s,buf1,…)>0){}if(select(0,&readfds,0,0,&tmo)>=0){if(FD_ISSET(s,&readfds)){}FD_SET(ss,&readfds);生成查询队列if(FD_ISSET(s,&writefds)){…}}……getsfromsockets`queue45通信程序框架小结并发服务(肯定具有多路复用)while(1){ns=accept(s,…);pid=fork();if(pid==0){closesocket(s)recv(ns,…);send(ns,…);……exit(0);}else{closesocket(ns);}46通信程序框架小结非多路复用与多路复用的比较服务器应采用多路复用的设计,除非……不采用多路复用的服务器几乎没有适用场合客户机如果采用多路复用的设计,将……客户机的功能将获得提升关键是客户机程序具备了事件驱动的框架!47基本思想重复服务与并发服务方式的比较程序结构重复服务:轮询并发服务:主、子进程,同时并发系统效率查询——时间都浪费在询问上进程调度——时间都浪费在上下文切换的开销上实现的难易度(特别在多个用户接入的情况)例,用户接入系统输入用户名,口令重复服务必须统一管理每个套接字的通信状态并发服务下,一个线程(进程)一般只对应一个套接字,不需要统一管理,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论