电子科技大学网络软件设计复习

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二:通信程序基本流程
∙掌握四种类型程序最简单。

最基本的流程
o面向连接服务器/客户机,无连接服务器/客户机
∙流程中重要的变量
o套接字标识符
o缓冲区
∙流程中具有阻塞功能的函数,通过调试体会阻塞的实际效果
o accept
o recv
o recvfrom
o connnect
实验三:客户服务器模式
∙验证只有在客户服务器方式才能建立正常通信
对比测试:采用两个客户机,互相之间不能建立连接。

∙采用两个客户机是否可能有一方建立成功?为什么?
有时能成功建立连接,与系统的TCP/IP协议版本有关,理论上只有客户/服务器模式才能通信。

TCP/IP2004年新版本中在客户机状态转换中增加了等待SYN报文的处理,提高了客户机之间建立连接的可能性,增加的这个“等待”没有违反客户/服务器原则。

∙服务器例程是否一定要设计为循环等待模式?还有其他选择吗?如果不循环可以吗?
不循环,就只能为一个客户服务,循环起来就能在完成一个通信服务以后,接收下一个连接.
实验四:套接字标识符本地有效
∙验证套接字标识符的作用范围仅限于一个进程内
证明方法:在两个不同的进程中,使用相同的套接字标识符可以完成两个不同的通信.
∙本实验的两个例程如果与相同的服务器建立连接会怎样?
不同进程中使用相同的套接字标识符并不互相影响.
∙不同进程使用相同的套接字,绑定相同的端口号,是否可以?
不可以,相同的端口号将影响系统对通信身份的确定和区分.
∙通信服务的共享:即如何让两个不同的进程共享一个通信服务,即与远方同一个进程通信?
需要高超手段----对套接字控制(REOPEN),高层还需要设计一个协议,至少能够区分不同的应用进程。

实验五:套接字接口函数
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将得到一个错误返回,类似信件被退回的提示实验六:网络字节序
∙测试与网络字节序有关的函数的功能
htonl htons ntohl ntohs inet_addr inet_ntoa
∙利用调试器观察内存,了解数据存放情况
o整数在Intel(PC机)内存中存放时低地址存放低字节,观察起来类似“写反了”效果;经过字节序函数处理以后,就变成了低地址存放高字
节,好像“写正了”。

o就算是同样的数据,如果解读内存的方法不同,得到的是不同的结果。

例如:八王,从左往右读是八王,从右往左读就成了王八。

∙利用sniffer截取分组,观察上述函数的实际执行效果
∙如果通信两边是相同的硬件体系,则都执行或都不执行网络字节序函数,结果都是正确的。

o但是如果不能确定以上条件,即两边是否相同的硬件体系,以及对方是否执行网络字节序,则应遵守标准——执行字节序函数
实验七:隐式绑定
∙掌握隐式绑定的作用
∙了解具有隐式绑定功能的套接字接口函数
o connet,sendto
∙利用netsstat命令观察端口活动的状态
o可进一步观察系统隐式分配端口的规律
∙隐式绑定不影响通信的正常完成,而且会带来很大的便利,特别是同时执行多个客户机程序时,每个客户机的程序相同,由系统分配不同的端口号,采用显示绑定则只能有一个客户机能成功,其他的客户机会绑定失败。

∙系统为什么不推荐在本地一个端口上显示绑定多个套接字的方法呢?
o容易引起混淆,例如这些客户机都与同一个服务器连接时这条多连接上通信双方的地址和端口号都相同,无法区分了。

实验八:accept与连接建立
掌握与连接建立相关的函数的执行效果,特别是与TCP协议的配合情况
●利用sniffer在单步调试程序时截取报文,可以了解函数执行与协议配合的情

o listen后,TCP实体可自动与客户机完成三次握手过程,即执行accpet 前,连接已经将建立了
o connect并不产生任何TCP报文
●通过多次对比测试,发现系统总的连接数会大于listen限定的客户数量,这
是因为listen只限定了尚未通过accpet交用户接管的暂存在系统的连接数量
o所以,listen不能限制连接总数
o另一方面,由于listen的限定有限,要更多地接入客户,就应尽量加大执行accept的频率,以提高“接通率”。

●如何使服务器在连接建立期间拒绝连接?
o除了在listen中限定个数外,没有其他手段(接口函数)可以再连接建立过程就终止。

●为什么客户端关闭套接字以后,服务器还能接收到客户机送来的数据?
o该数据是客户机关闭套接字前发送给服务器的,暂存在套接字的接收数据队列上
o在队列中数据排在关闭连接的控制之前,所以服务器因排队机制会先处理数据再关闭连接。

●为什么本实验中服务器能够比《套接字接口函数》实验中多接收一个客户机
的连接?由此引申开来,如果要使服务器能够同时为超过5个以上的连接服务,应从什么地方着手?
o对listen限定不了连接的总数,服务器程序只要加快执行accept的频率,就能不受限制。

基于select的机制和多线程并发结构都能加快执行
accept的频率。

实验九:连接的关闭
∙掌握关闭连接的高层协商、粗暴关闭和雅致关闭等方法
∙对比着三种方式,可从程序设计的复杂度、执行效果等方面有较深入的体会∙配合sniffer可以了解各种关闭连接方式下,TCP协议的配合情况
o RST报文出现的场合——直接点X关闭程序
o FIN出现的场合——执行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返回为错误的时候,怎样才能区分是因为连接被关闭,还是因为非阻塞情况下没有收到对方数据呢?
o recv返回值为-1,取得错误代码——WOULDBLOCK
∙从本实验的角度,在select中设置超时值和设置超时为NULL即阻塞状态,能否在实验效果上对比出两者的不同?
o基本不能,因为都遵循了让权等待,与“忙等”相比,从100%的CPU 耗费降低到1%以下,大头消去了,1%以内的差别,系统没有提供更精
确的统计。

∙accept的原理是从朱套接字上复制一个新的套接字,为新的连接服务。

如果在主套接字上先设置为非阻塞状态,则从套接字是否也是非阻塞状态?怎样证明?
o是的,代码中从套接字没有设置为非阻塞态,但从套接字执行recv后不会阻塞,所以是非阻塞态——accept得到的从套接字是复制主套接字,
包括套接字的状态
实验十三:并发服务
∙通过分析步骤3的实验现象,你对线程的调度有些什么体会?
o具有分时调度的特点——线程执行的结果轮流交替出现
∙步骤5的实验现象和之前的哪个实验的现象类似?为什么并发服务可以提供多路复用的功能?
o与基于select的多路复用相似,可以同时为多个客户连接提供服务。

因为系统是多任务调度的,可并发推进多个线程
∙为什么利用spy看到的CONSERVER的线程个数比实际因客户连接二创建的线程数多一个?
o一个主线程加N个子线程,每个子线程对应一个客户
∙本实验中服务器创建的子线程将怎样结束?
o通信完毕,线程函数执行到最后一步,retern结束。

而主线程则会一直循环运行。

∙对比基于select和多线程的框架设计
o功能上都能实现多路复用
o性能上各有千秋,但总的差距不大
o一般情况下,如果用户之间独立性强,使用多线程可简化代码编写。

例如网页浏览多采用多线程方案。

o如果线程间需要协调,就比较麻烦,例如,“电话会议”应用,需要把一个客户的数据发送给其他参会的客户,用基于select的方法就比较容
易,只要把从一个套接字收的数据转发给服务器所管理的一组套接字队
列上的其他客户就行了。

而多线程方案就很难把一份数据送给所有的线
程共享了。

实验十四:状态与有限状态机设计
∙掌握有限状态机程序设计的过程
o画状态图
o完成状态转移表
o根据状态转移表,完成程序
∙程序信息如何传输、保存?
o PDU的设计和实现
∙状态机程序的分支处理框架结构
∙学习事件产生的技巧
o套接字事件:利用select查询
o定时事件:利用select的超时查询机制
∙请为有状态通信和无状态通信各举一个实例说明
o有状态:停等协议;需要认证身份的系统
o无状态:页面浏览;聊天等及时通信的过程
实验十五:基于消息驱动的windows程序设计
∙学会创建一个windows程序工程的方法
o了解windows工程的基本组成
∙掌握基于消息驱动的界面交互程序设计基本思想
o了解制作界面菜单的方法
o通过测试感受
windows中的消息驱动方法和
windowsP 函数中的消息
∙了解简单的窗口程序输入、输出方法
∙在窗口程序中移植通信程序
o发现阻塞程序导致窗口界面无响应
o非阻塞(基于socket)也导致窗口界面无响应
∙窗口程序采用的消息机制特点是什么?
o界面上的动作都会调用WindowPro函数,并以消息的方式通知界面上发生了什么。

∙为什么服务器程序的窗口停止了响应?此时服务器程序是否停止了?
o服务器程序没有停止,对于客户机的数据仍发回了响应,但是就因为此时的程序陷入在不断循环等待套接字数据内,没有办法回到主循环去
GetMessage。

就没有办法响应界面的动作,成为“假死”。

实验十七:MFC工程
∙学会制作一个MFC工程的基本方法
o了解windows工程的基本组成
o可以方便的设计界面,更多控件
∙学会在MFC工程环境下的输入输出方法
o在指导下制作一个简单界面
o UpdataData()
∙将通信程序移植到MFC环境中
∙学会基本控件的制作方法
o按钮、编辑框、IP地址等控件。

相关文档
最新文档