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

下载本文档

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

文档简介

网络软件设计,多路通信与select()阻塞与非阻塞机制,制作主讲,段景山,2,多路通信问题的提出(一),标准服务器流程,listen(s,5);,while(1),newsock=accept(s,);,recv(newsock,buf1,);,send(newsock,buf2,);,processbuf1;,preparebuf2;,closesocket(newsock);,while(recv(newsock,buf1,)0),虽然在客户机一端已有多个已建立连接的套接字,但服务器流程限制了每次只能对一个连接进行操作,需要一种机制能使服务器程序同时操作多条连接,ASectionofCOServer,多路通信问题的提出(二),3,利用标准流程建立的一个聊天程序框架,connect(s,);,while(1),recv(s,rcvBuf,);,send(s,sndBuf,);,printf(“%s”buf2),closesocket(newsock);,受流程限制,必须要读到键盘数据,才能发送,才能接收对方的数据;必须收到对方的数据后,才能等待键盘输入数据。需要一种机制能使程序同时等待多个事件。,ASectionofCOClient,scanf(”%s”,sndBuf);,4,多路通信设计,什么叫多路通信/多路复用?多条连接上的数据同时通信什么叫“同时”?同一时刻并行同一时间并发:在一段时间内同时发生一段时间究竟有多长?通信领域:从通信的开始到通信的结束从建立连接到关闭连接,5,多路通信设计,怎样同时通信?,“感觉”上的同时,因为实际上还是只有一只“笔”,任务队列,逐个处理各任务的事件,注意不是以任务为单位,而是以事件为单位,从总体时间看,在一段时间内“同时”处理了多个任务的事件,6,select(),功能设计:该函数能检查多个套接字的状态,服务器程序就可以根据这些信息做出相应的处理输入:套接字队列将希望多路操作的一组套接字排成队列输出:各待查套接字当前的状态如:是否有数据到达,是否需要关闭等,7,Select()程序框架,多路复用的程序基本框架,技术难点,makethesockets_list,while(1),select(sockets_list);,逐个检查队列中的套接字状态;,不同的状态作出相应的处理;,for(i=0;in;i+)getasocketfromlist;switch(socketstate)caseRECV:recv(socket,data);process(data);caseCLOSE:closesocket(socket);,套接字队列和状态表示,8,多路复用程序设计关键技术,关键技术:套接字队列状态表示与处理,9,关键技术:套接字队列,1、套接字队列2、套接字队列的操作初始化、插入、删除、查找、遍历等,typedefstructfd_setu_intfd_count;SOCKETfd_arrayFD_SETSIZE;fd_set;,fd_count:队列中有多少个套接字;fd_array:套接字队列,10,关键技术:套接字队列,套接字接口提供了一些专门的操作实现套接字队列的插入、删除和查找等功能初始化FD_ZERO(*set)初始化套接字队列set插入FD_SET(s,*set)将套接字s插入到队列set中删除FD_CLR(s,*set)从队列set中删除套接字s查找FD_ISSET(s,*set)查找s是否在队列set中,例,11,关键技术:套接字队列,除了“查询套接字”队列,我们还需要建立自己套接字队列套接字管理队列为什么?1、查询套接字队列内容在每次select后会动态变化2、我们需要一个完整的队列以便每次能保证检索所有的“在线”套接字怎么做?,makethesockets_list,while(1),select(sockets_list);,for(i=0;i0),套接字函数的阻塞对多路复用技术可能造成阻碍,FD_SET(s,if(select(0,/*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(,If(retval=-1)retval=WSAGetLastError()if(retval=WSAEWOULDBLOCK)means当前无数据,42,阻塞与非阻塞小结,阻塞与否是套接字的状态阻塞与否与具体任务要求及设计流程有关简单设计时,让套接字阻塞复杂设计时,套接字为非阻塞,通过select的timeout参数在阻塞和非阻塞之间找寻平衡点。同时应考虑数据缓冲和工作流控制,以备接续暂停的工作所需阻塞与否还将影响程序编写的细节如对recv等函数返回值的处理,towaitornot,isaproblem,43,通信程序框架小结,除了四种基本流程外,在通信程序的框架设计上常有以下讨论:多路复用与非多路复用服务器同时为多个客户提供服务并发服务基于select的重复服务服务器只能为一个客户提供服务重复服务与并发服务仅使用一个进程(线程)利用循环,依次为客户提供通信服务非多路复用的重复服务基于select的重复服务使用多个线程并发推进提供通信服务并发服务,通信程序框架小结,非多路复用的重复服务,44,s=socket(SOCK_STREAM);,bind(s,);,listen(s,5);,while(1),ns=accept(s,);,recv(ns,);,send(ns,);,closesocket(ns);,closesocket(s);,通信程序框架小结,基于select的具有多路复用的重复服务,45,while(1),while(recv(s,buf1,)0),if(select(0,pid=fork();,if(pid=0)closesocket(s)recv(ns,);send(ns,);exit(0);,elseclosesocket(ns);,通信程序框架小结,非多路复用与多路复用的比较服务器应采用多路复用的设计,除非不采用多路复用的服务器几乎没有适用场合客户机如果采用多路复用的设计,将客户机的功能将获得提升关键是客户机程序具备了事件驱动的框架!,47,48,基本思想,重复服务与并发服务方式的比较程序结构重复服务:轮询并发服务:主、子进程,同时并发系统效率查询时间都浪费在询问上进程调度时间都浪费在上下文切换的开销上实现的难易度(特别在多个用户接入的情况)例,用户接入系统输入用户名,口令重复服务必须统一管理每个套接字的通信状态并发服务下,一个线程(进程)一般只对应一个套接字,不需要统一管理,但涉及线程的控制、资源同步,思考,49,请解释什么是重复服务/循环服务,什么是多路复用/并发服务。阻塞与非阻塞将在哪些方面对程序设计产生影响?,50,套接字队列例程,main(),fd_setsock_list;,SOCKETs,ss;,FD_ZERO(,FD_SET(s,FD_SET(ss,FD_CLR(s,intcheck;,check=FD_ISSET(s,check=FD_ISSET(ss,/check=,/check=,0,1,51,状态队列例程1,main(),FD_SET(s,select(,if(FD_ISSET(s,processdata;,FD_SET(ss,if(FD_ISSET(

温馨提示

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

评论

0/150

提交评论