您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 电子科技大学网络软件设计复习
实验二:通信程序基本流程掌握四种类型程序最简单。最基本的流程o面向连接服务器/客户机,无连接服务器/客户机流程中重要的变量o套接字标识符o缓冲区流程中具有阻塞功能的函数,通过调试体会阻塞的实际效果oacceptorecvorecvfromoconnnect实验三:客户服务器模式验证只有在客户服务器方式才能建立正常通信对比测试:采用两个客户机,互相之间不能建立连接。采用两个客户机是否可能有一方建立成功?为什么?有时能成功建立连接,与系统的TCP/IP协议版本有关,理论上只有客户/服务器模式才能通信。TCP/IP2004年新版本中在客户机状态转换中增加了等待SYN报文的处理,提高了客户机之间建立连接的可能性,增加的这个“等待”没有违反客户/服务器原则。服务器例程是否一定要设计为循环等待模式?还有其他选择吗?如果不循环可以吗?不循环,就只能为一个客户服务,循环起来就能在完成一个通信服务以后,接收下一个连接.实验四:套接字标识符本地有效验证套接字标识符的作用范围仅限于一个进程内证明方法:在两个不同的进程中,使用相同的套接字标识符可以完成两个不同的通信.本实验的两个例程如果与相同的服务器建立连接会怎样?不同进程中使用相同的套接字标识符并不互相影响.不同进程使用相同的套接字,绑定相同的端口号,是否可以?不可以,相同的端口号将影响系统对通信身份的确定和区分.通信服务的共享:即如何让两个不同的进程共享一个通信服务,即与远方同一个进程通信?需要高超手段----对套接字控制(REOPEN),高层还需要设计一个协议,至少能够区分不同的应用进程。1)面向连接的服务器流程:申请套接字;确定本地端点,填写端点地址;建立套接字与端点关系;设置为监听模式(服务器模式);接受一个连接;完成通信过程;关闭连接的套接字。s=socket(…);address=…;bind(s,address…);listen(s);newsock=accept(s);recv(newsock);send(newsock);closesocket(newsock);2)面向连接的客户机流程;申请套接字;确定本地端点,填写端点地址;建立套接字与端点关系;确定服务器端点;与服务器建立连接;完成通信过程;关闭套接字。s=socket(…);c_addr=…;bind(s,c_addr…);s_addr=…;connect(s,s_addr);recv(s);send(s);closesocket(s);3)无连接的服务器流程;申请套接字;确定本地端点,填写端点地址;建立端点与套接字关系;等待接收数据;完成通信过程;关闭套接字4)无连接的客户机流程;申请套接字;确定本地端点,填写端点地址;建立端点与套接字关系;发送数据;完成通信过程;关闭套接字实验五:套接字接口函数1.针对常用的套接字函数进行测试o掌握套接字接口函数的基本功能掌握通过去函数返回值判断是否出错的方法o掌握通过WSAGetlasterror取得出错类型的方法o增加网络程序调试的经验使用的主要测试方法o使用异常参数测试:如边界值,越界值等常见的错误:10038:在一个非套接字上尝试了一个操作。10048:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。10061:由于目标计算机积极拒绝,无法连接。10054:远程主机强迫关闭了一个现有的连接。10035:无法立即完成一个非阻止性套接字操作。2.主要的收获大多数非AF_INET协议没有得到winsock的支持流套接字可以由不同协议支持,但目前是TCP不能再已经有套接字活动的端口上再绑定一个套接字listen制定个数为0时,也能接受客户连接Accept虽然可以传入一个端点地址结构给系统,但不能通过它限制只从某个连接对端接受连接接收时的缓冲区指针必须事先指向一个“实际”可使用的空间,而且缓冲区大小参数也只能小于实际大小,不能超过。发送时的缓冲区也需要遵循同样的原则不能与INADDR_ANY地址、广播地址建立连接Recvfrom一定要先建立本地半相关,即先确定在哪个UDP端口上收数据如果前一次sendto将数据传送到了无人接收的地方,下一次recvfrom将得到一个错误返回,类似信件被退回的提示实验六:网络字节序测试与网络字节序有关的函数的功能htonlhtonsntohlntohsinet_addrinet_ntoa利用调试器观察内存,了解数据存放情况o整数在Intel(PC机)内存中存放时低地址存放低字节,观察起来类似“写反了”效果;经过字节序函数处理以后,就变成了低地址存放高字节,好像“写正了”。o就算是同样的数据,如果解读内存的方法不同,得到的是不同的结果。例如:八王,从左往右读是八王,从右往左读就成了王八。利用sniffer截取分组,观察上述函数的实际执行效果如果通信两边是相同的硬件体系,则都执行或都不执行网络字节序函数,结果都是正确的。o但是如果不能确定以上条件,即两边是否相同的硬件体系,以及对方是否执行网络字节序,则应遵守标准——执行字节序函数实验七:隐式绑定掌握隐式绑定的作用了解具有隐式绑定功能的套接字接口函数oconnet,sendto利用netsstat命令观察端口活动的状态o可进一步观察系统隐式分配端口的规律隐式绑定不影响通信的正常完成,而且会带来很大的便利,特别是同时执行多个客户机程序时,每个客户机的程序相同,由系统分配不同的端口号,采用显示绑定则只能有一个客户机能成功,其他的客户机会绑定失败。系统为什么不推荐在本地一个端口上显示绑定多个套接字的方法呢?o容易引起混淆,例如这些客户机都与同一个服务器连接时这条多连接上通信双方的地址和端口号都相同,无法区分了。实验八:accept与连接建立掌握与连接建立相关的函数的执行效果,特别是与TCP协议的配合情况利用sniffer在单步调试程序时截取报文,可以了解函数执行与协议配合的情况向连接服务器的各接口函数:socket、bind、listen、accept、send、recv、closesocketolisten后,TCP实体可自动与客户机完成三次握手过程,即执行accpet前,连接已经将建立了oconnect并不产生任何TCP报文通过多次对比测试,发现系统总的连接数会大于listen限定的客户数量,这是因为listen只限定了尚未通过accpet交用户接管的暂存在系统的连接数量o所以,listen不能限制连接总数o另一方面,由于listen的限定有限,要更多地接入客户,就应尽量加大执行accept的频率,以提高“接通率”。如何使服务器在连接建立期间拒绝连接?o除了在listen中限定个数外,没有其他手段(接口函数)可以再连接建立过程就终止。为什么客户端关闭套接字以后,服务器还能接收到客户机送来的数据?o该数据是客户机关闭套接字前发送给服务器的,暂存在套接字的接收数据队列上o在队列中数据排在关闭连接的控制之前,所以服务器因排队机制会先处理数据再关闭连接。为什么本实验中服务器能够比《套接字接口函数》实验中多接收一个客户机的连接?由此引申开来,如果要使服务器能够同时为超过5个以上的连接服务,应从什么地方着手?o对listen限定不了连接的总数,服务器程序只要加快执行accept的频率,就能不受限制。基于select的机制和多线程并发结构都能加快执行accept的频率。实验九:连接的关闭掌握关闭连接的高层协商、粗暴关闭和雅致关闭等方法对比着三种方式,可从程序设计的复杂度、执行效果等方面有较深入的体会配合sniffer可以了解各种关闭连接方式下,TCP协议的配合情况oRST报文出现的场合——直接点X关闭程序oFIN出现的场合——执行closescoket,shutdown掌握通过套接字返回值判断对方关闭方式的方法o如recv返回-1时表示粗暴关闭,0时表示雅致关闭体会雅致关闭时,从两个方向分别关闭的特点o通信完整进行的保证实验十:字节流与数据报服务通过对比试验掌握字节流服务与数据报服务的不同特点方法:o单次发送较大量数据——多次接收使用较小的缓存o多次发送少量数据——单次接收使用较大的缓存o对传输数据的限制:字节流没有限制,任意分拆,合并数据报有限制,一次发送对应一次接受o流的体会:发送为无结构形式,接收也为无结构形式o引发的思考字节流不适合交互式通信例如,如果任意把发送方两次发送的数据合并成一次接受,有可能造成误会,或者一次性接收没有得到完整内容,也可能造成误会长文件传输没有这种问题,文件内容本身就可以视为字节流字节流不适合实时视频是因为TCP协议进行差错处理后不能保证数据实时性了为什么数据报服务不能分拆和合并用户数据呢?o无连接方式下,各报文是相互独立的,有各自的目的地和源数据报服务下最大可发送长度和哪些数据(参数)有关?o网络层分组的最大长度,网络层分组头长,UDP报文头长。实验十一:多路复用掌握多路复用程序的基本流程掌握多路复用程序设计的关节技术o套接字管理o事件处理引导实验者逐步设计并完成一个比较复杂的多路复用程序o套接字管理队列结构设计o主体查询框架o获得套接字状态的方法o根绝各种状态设计处理模块的流程o将各部分组合,完善如果在客户机设计中使用了select,该客户机能够达到什么样的功能。换句话说,在哪种情形下,我们会在客户机程序中设计select流程a.客户机也可能需要打开多个套接字与多个服务器通信b.客户机也可能以事件驱动的方式工作,建立select机制,是为了建立事件驱动的框架,就算只查询了一个套接字。c.还可以利用select的超时参数来设计定时器。有人认为,假设套接字S上发生了读时间,我们是通过selsect后发现s在读状态队列中才知道的,因此在下一次select前,s已经在读状态队列上,没有必要再把它放入进去,以此类推,没有必要在每次select之前,都重新在状态队列上加入各套接字。请问,这样做将造成什么样的后果,试举一例来说明o只要有一次select时,套接字上没有数据,该套接字就被清除出队伍了。如果我们把套接字放到写状态队列上,会发现每次select,各套接字总是处于可写状态,这说明什么?o只要套接字不是特别繁忙,可写状态总是存在的,与读状态不同o如果总是在查询套接字的可写状态,将导致slect的让权机制失效,形成忙等,造成系统资源的浪费,通过观察CPU利用率可以看到。o对可写状态正确的处理应该是需要发送时,才查询套接字的可写状态。实验十二:阻塞与非阻塞当recv返回为错误的时候,怎样才能区分是因为连接被关闭,还是因为非阻塞情况下没有收到对方数据呢?orecv返回值为-1,取得错误代码——WOULDBLOCK从本实验的角度,在select中设置超时值和设置超时为NULL即阻塞状态,能否在实验效果上对比出两者的不同?o基本不能,因为都遵循了让权等待,与“忙等”相比,从100%的CPU耗费降低到1%以下,大头消去了,1%以内的差别,系统没有提供更精确的统计。accept的原理是从朱套接字上复制一个新的套接字,为新的连接服务。如果在主套接字上先设置为非阻塞状态,则从套接字是否也是非阻塞状态?怎样证明?o是的,代码中从套接字没有设置为非阻塞态,但从套接字执行recv后不会阻塞,所以是非阻塞态——accept得到的从套接字是复制主套接字,包括套接字的状态实验十三:并发服务通过分析步骤3的实验现象,你对线程的调度有些什么体会?o具有分时调度的特点——线程执行的结果轮流交替出现步骤5的实验现象和之前的哪个实验的现象类似?为什么并发服务可以提供多路复用的功能?o与基于select的多路复用相似,可以同时为多个客户连接提供服务。因为系统是多任务调度的,可并发推进多个线程为什么利用spy看到的CONSERVER的线程个数比实际因客户连接二创建的线程数多一个?o一个主线程加N个子线程,每个子线程对应一个客户本实验中服务器创建的子线程将怎样结束?o通信完毕,线程函数执
本文标题:电子科技大学网络软件设计复习
链接地址:https://www.777doc.com/doc-7123623 .html