实验2利用停止等待协议传输数据文件
- 格式:doc
- 大小:73.50 KB
- 文档页数:7
实验2:可靠数据传输协议-停等协议的设计与实现
1.实验目的
理解可靠数据传输的基本原理;掌握停等协议的工作原理;掌握基于 UDP 设计并实现一个停等协议的过程与技术。
2.实验环境
接入Internet的实验主机;
Windows xp或Windows7/8;
开发语言:python。
3.实验内容
1)基于 UDP 设计一个简单的停等协议,实现单向可靠数据传输(服务器到客户的数据传输)。
2)模拟引入数据包的丢失,验证所设计协议的有效性。
4.程序设计
在实验报告中要说明所设计停等各个域作用,协议两端程序流程图,协议典型交互过程,数据分组丢失验证模拟方法,程序实现的主要类(或函数)及其主要作用、UDP 编程的主要特点、实验验证结果,详细注释源程序等。
1)协议主要数据结构:
客户端:
服务器:
数据包格式:分为数据分组和确认分组
-数据分组:为数据分组序号后面加上数据内容,如‘0HELLO’
-确认分组:为确认类型与确认分组号,如‘ACK0’。
为了实现丢包,增加NAK类型,如‘NAK0’。
2)协议两端程序流程图:客户端:
服务器:
3)UDP编程的主要特点:
-在python3中,能传输的只有比特字符串,因此要加以转换
-由于是网络编程,很可能发生各种异常,有必要进行捕捉并处理。
停止等待协议的工作原理停止等待协议是计算机网络中常用的一种协议,用于解决数据在传输过程中可能出现的错误和丢失情况。
该协议的工作原理可以分为以下几个步骤:第一步:发送方数据分包和发送在停止等待协议中,发送方在发送数据时,将数据分成若干个数据包,每个数据包含有一个序列号和具体的数据内容。
发送方按照一定的时间间隔(如1秒)将数据包发送给接收方,并等待接收方的确认信息。
第二步:接收方接收和反馈信息接收方在接收到数据包后,将数据包中的内容提取出来,并进行校验,判断数据包是否完整和正确。
如果数据包正确,接收方向发送方发送一个确认信息,该确认信息包含有接收到的数据包的序列号。
发送方在接收到确认信息后继续发送下一个数据包。
如果数据包不正确,接收方丢弃该数据包,并向发送方发送一个拒绝信息。
第三步:发送方超时重传如果发送方发送了一个数据包,但在一定时间内没有收到接收方的确认信息,发送方认为该数据包丢失了,就向接收方重新发送该数据包。
在重新发送该数据包时,发送方会将该数据包的序列号标注为“重传”,接收方在接收到“重传”数据包的确认信息后,也会将“重传”的标识返回给发送方。
第四步:接收方拒绝重传如果接收方在接收到数据包时发现数据包不正确,就会向发送方发送一个拒绝信息,该拒绝信息包含有接收方让发送方重新发送的数据包的序列号。
发送方在接收到拒绝信息后,会将被拒绝的数据包重新发送给接收方,接收方在接收到这些数据包时,不会将这些数据包的确认信息返回给发送方。
这样做的目的是为了避免数据包的重复发送。
综上所述,停止等待协议是一种解决数据丢失和错误的常见协议。
该协议的工作原理是将数据分成若干个数据包,按照一定的时间间隔发送给接收方,并等待接收方的确认信息。
如果数据包在传输过程中出现错误或丢失,发送方会进行超时重传,接收方会向发送方发送拒绝信息。
通过这些步骤,可以确保数据的安全性和完整性。
停止等待协议停止等待协议(Stop-and-Wait Protocol)是一种简单且常用的协议,用于在数据传输过程中确保数据的可靠性。
这种协议在通信的发送和接收过程中,必须等待对方的确认,并且只有在收到确认之后才能发送下一个数据包。
停止等待协议的基本原理非常简单。
当发送方准备好发送数据时,它先发送一个数据包给接收方。
接收方则等待接收数据,并且在成功接收到数据后,发送一个确认消息给发送方,告诉发送方数据已经接收成功。
发送方接收到确认消息后,就会发送下一个数据包。
如果接收方没有成功接收数据,或者发送方没有成功接收确认消息,那么发送方将重新发送数据包。
在停止等待协议中,数据包的发送和接收都是按照序列号来进行的。
发送方会给每个数据包分配一个唯一的序列号,并且在数据包中加入这个序列号,以便接收方能够准确地识别是哪个数据包。
接收方在接收到数据包之后,会将确认消息中包含这个序列号,以使发送方能够知道哪个数据包已经成功接收。
如果接收方在一定的时间内没有收到正确的序列号的数据包,它会发送一个特殊的确认消息给发送方,告诉发送方需要重新发送这个数据包。
停止等待协议的优点是简单易懂,并且能够确保数据的可靠传输。
它适用于小规模的数据传输,对于大规模的数据传输则效率较低。
这是因为在停止等待协议中,发送方必须等待接收方发送确认消息才能继续发送下一个数据包。
如果网络延迟较高或者丢包率较高,发送方的发送速度将受到很大限制,从而导致传输效率低下。
为了提高传输效率,停止等待协议可以进行一些改进。
一种常见的改进是引入滑动窗口机制。
滑动窗口可以同时发送多个数据包,并且不需要等待接收方发送确认消息。
接收方只需要在收到数据包后按序发送确认消息即可。
这种机制能够充分利用网络带宽,提高传输效率。
总而言之,停止等待协议是一种简单而常用的协议,用于在数据传输过程中确保数据的可靠性。
虽然效率较低,但它的原理简单易懂,适用于小规模的数据传输。
通过引入滑动窗口机制,可以提高传输效率。
数据通信与计算机网络第五版第三章数据链路层3-1 数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与“数据链路接通了”的区别何在?解答:所谓链路就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。
在进行数据通信时,两个计算机之间的通信路径往往要经过许多段这样的链路。
可见链路只是一条路径的组成部分。
数据链路则是另一个概念。
这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输(这将在后面几节讨论)。
若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
这样的数据链路就不再是简单的物理链路而是个逻辑链路了。
“电路接通了”仅仅是物理线路接通了通信双方可以在上面发送和接收0/1比特了,而“数据链路接通了”表明在该物理线路接通的基础上通信双方的数据链路层协议实体已达成了一致并做好了在该链路上发送和接收数据帧的准备(可能互相要协商某些数据链路层参数)。
3-2 数据链路层包括哪些主要功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。
解答:数据链路层的链路控制的主要功能包括:封装成帧、透明传输和差错检测,可选功能包括可靠传输、流量控制等。
在数据链路层实现可靠传输的优点是通过点到点的差错检测和重传能及时纠正相邻结点间传输数据的差错。
若在数据链路层不实现可靠传输由高层如运输层通过端到端的差错检测和重传来纠正这些差错会产生很大的重传时延。
但是在数据链路层实现可靠传输并不能保证端到端数据传输的可靠,如由于网络拥塞导致路由器丢弃分组等。
因此,即使数据链路层是可靠的,在高层如运输层仍然有必要实现端到端可靠传输。
如果相邻结点间传输数据的差错率非常低,则在数据链路层重复实现可靠传输就会给各结点增加过多不必要的负担。
3-3 网络适配器的作用是什么?网络适配器工作在哪一层?解答:网络适配器的作用就是实现数据链路层和物理层的功能。
适配器接收和发送各种帧时不使用计算机的CPU 。
实验停止等待协议分析与协议模拟实现一、协议介绍停止等待协议是一种简单的可靠数据传输协议,用于在不可靠信道上进行数据传输。
该协议的基本原理是发送方发送一帧后,等待接收方的确认帧,接收方收到帧后发送确认帧,发送方收到确认帧后才发送下一帧。
本实验旨在分析停止等待协议的性能和实现一个简单的协议模拟。
二、实验步骤1. 确定实验环境- 操作系统:Windows 10- 编程语言:Python 3.9- 开发环境:PyCharm2. 实验准备- 安装Python 3.9和PyCharm- 创建一个新的PyCharm项目,命名为"StopAndWaitProtocolSimulation"3. 实现停止等待协议- 创建一个名为"sender.py"的Python文件,实现发送方的逻辑。
- 创建一个名为"receiver.py"的Python文件,实现接收方的逻辑。
- 在发送方和接收方的代码中,使用Socket编程实现数据的发送和接收。
- 在发送方和接收方的代码中,实现停止等待协议的逻辑,包括发送帧、接收帧、发送确认帧等操作。
4. 编写测试代码- 创建一个名为"test.py"的Python文件,用于测试停止等待协议的性能。
- 在测试代码中,模拟发送方发送多个帧,并统计发送时间、接收时间、丢包率等指标。
- 在测试代码中,输出测试结果并保存到文件中,用于后续分析。
5. 运行实验- 在PyCharm中,分别运行"sender.py"和"receiver.py"。
- 在PyCharm中,运行"test.py",观察测试结果。
6. 分析实验结果- 根据测试结果,分析停止等待协议的性能,包括吞吐量、延迟、丢包率等指标。
- 根据测试结果,优化停止等待协议的实现,提高性能和可靠性。
三、注意事项1. 确保实验环境的稳定性和可靠性,避免其他应用程序的干扰。
实验停止等待协议分析与协议模拟实现停止等待协议分析与协议模拟实现一、引言停止等待协议是一种简单且常用的协议,用于在数据通信中实现可靠的传输。
本文将对停止等待协议进行详细分析,并进行协议模拟实现。
二、协议分析1. 协议描述停止等待协议是一种基于确认的可靠传输协议。
发送方将数据分割为固定大小的数据包,并逐个发送给接收方。
接收方在成功接收一个数据包后,发送一个确认消息给发送方。
如果发送方在一定时间内未收到确认消息,则认为数据包丢失,需要重新发送。
2. 协议流程发送方:- 将数据分割为固定大小的数据包。
- 发送数据包给接收方。
- 等待接收方发送确认消息。
- 如果在超时时间内未收到确认消息,则重新发送数据包。
接收方:- 接收数据包。
- 发送确认消息给发送方。
- 如果接收到的数据包已经接收过,则丢弃。
3. 协议特点停止等待协议具有以下特点:- 简单易实现:协议的流程简单明了,易于实现。
- 带宽浪费:发送方在等待确认消息期间无法发送新的数据包,导致带宽浪费。
- 无序接收:接收方可能会因为网络延迟或丢包而导致数据包无序接收。
三、协议模拟实现为了更好地理解停止等待协议的工作原理,我们将进行协议模拟实现。
以下是实现的步骤:1. 环境准备- 安装模拟器软件:我们将使用Python编程语言来实现停止等待协议的模拟。
请确保您的计算机上已经安装了Python环境。
- 导入必要的库:在Python程序中,我们需要导入socket库来进行网络通信。
2. 发送方实现- 创建发送方套接字:使用socket库创建发送方套接字,并指定通信协议和端口号。
- 读取待发送的文件:从本地文件系统中读取待发送的文件,并将文件内容分割为固定大小的数据包。
- 发送数据包:使用发送方套接字将数据包发送给接收方。
- 等待确认消息:设置超时时间,等待接收方发送确认消息。
- 处理超时:如果在超时时间内未收到确认消息,则重新发送数据包。
3. 接收方实现- 创建接收方套接字:使用socket库创建接收方套接字,并指定通信协议和端口号。
停止等待协议停止等待(stop-and-wait)协议是最简单但也是最基本的数据链路层协议。
很多有关协议的基本概念都可以从这个协议中学习到。
我们先从最简单的情况讲起。
一、不需要数据链路层协议的数据传输当两个主机进行通信时,应用进程要将数据从应用层逐层往下传,经物理层到达通信线路。
通信线路将数据传到远端主机的物理层后,再逐层向上传,最后由应用层交给远程的应用进程。
但现在为了把主要精力放在数据链路层的协议上,可以采用一个简化的模型(见下图),即把数据链路层以上的各层用一个主机来代替,而物理层和通信线路则等效成一条简单的链路。
数据链路层也可简称为链路层。
在发方和收方的链路层分别有一个发送缓冲区和接收缓冲区。
若进行全双工通信,则在每一方都要同时设有发送缓冲区和接收缓冲区。
缓冲区是必不可少的。
这是因为在通信线路上数据是以比特流的形式串行传输的,但在计算机内部数据的传输则是以字节(或若干个字节)为单位并行传输的。
因此,必须在计算机的内存中设置一定容量的缓冲区,以便解决数据传输速率不一致的矛盾。
下图所示的简化模型对于一个计算机网络中任意一条链路上的数据传输情况都是适用的。
在网络内部,各交换结点的数据链路层的上面只有一个网络层。
对于这种交换结点,网络层就相当于简化模型中的主机。
图4-10 两台计算机通过一条链路通信的简化模型为了深入理解数据链路层的协议,我们先从一种假想的、完全理想化的数据传输过程开始讨论。
下面即可看出,对于这种完全理想化的数据传输,数据链路层协议是根本不需要的。
为了和后面的讨论相衔接,我们假定数据传输是以帧为单位。
假定1:链路是理想的传输信道,所传送的任何数据既不会出差错也不会丢失。
假定2:不管发方以多快的速率发送数据,收方总是来得及收下,并及时上交主机。
第一个假定很容易理解。
对第二个假定则需加以解释。
我们假设主机A连续不断地向主机B发送数据。
在收方,主机B的链路层也就将收到的数据一帧接一帧地交给主机B。
停止等待协议计算例题一、例题1。
1. 题目。
- 已知数据链路层采用停止等待协议传输数据,发送方发送的数据帧长度为1000字节(包括首部等所有开销),数据传输速率为1Mbps,单向传播时延为10ms。
求发送方发送一帧数据所需的时间,以及从开始发送数据到收到确认帧所需的时间(假设确认帧长度忽略不计)。
2. 解析。
- 首先计算发送一帧数据所需的时间。
- 数据帧长度L = 1000×8位(因为1字节= 8位)=8000位。
- 数据传输速率R = 1Mbps = 1×10^6位/秒。
- 根据公式T_发送=(L)/(R),可得T_发送=(8000)/(1×10^6) = 8ms。
- 然后计算从开始发送数据到收到确认帧所需的时间。
- 这个时间包括发送数据帧的时间T_发送、传播时延T_p(往返)。
- 已知单向传播时延T_p=10ms,往返传播时延2T_p=2×10 = 20ms。
- 所以从开始发送数据到收到确认帧所需的时间T = T_发送+2T_p=8 +20=28ms。
二、例题2。
1. 题目。
- 在停止等待协议中,发送方发送的数据帧出错的概率为1%,确认帧出错的概率为1%。
若发送方连续发送10个数据帧,求成功发送这10个数据帧平均需要发送的次数。
2. 解析。
- 对于每个数据帧,成功发送一次的概率为(1 - 0.01)×(1 - 0.01)=0.99×0.99 = 0.9801。
- 设发送n次才能成功发送10个数据帧。
- 根据期望公式E(X)=n× p(这里X是发送次数,p是成功发送一次的概率)。
- 对于10个数据帧,期望发送次数n满足10 = n×0.9801,解得n=(10)/(0.9801)≈10.2次。
三、例题3。
1. 题目。
- 停止等待协议中,发送方的发送窗口大小W_S=1,接收方的接收窗口大小W_R=1。
若发送方发送的数据帧序号为0,接收方正确收到该帧并发送确认帧,但确认帧丢失。
实验停止等待协议分析与协议模拟实现协议名称:停止等待协议分析与协议模拟实现一、引言停止等待协议是一种简单的协议,用于数据传输过程中的错误控制。
本协议旨在通过分析停止等待协议的原理、特点和效率,以及通过协议模拟实现来更好地理解该协议的工作原理。
二、协议分析1. 原理停止等待协议的原理是发送方发送数据后等待确认,只有在收到确认后才发送下一个数据。
接收方在收到数据后发送确认,若数据出错则发送否定确认,要求发送方重新发送该数据。
2. 特点停止等待协议的特点包括:- 简单易实现:该协议的实现相对简单,适用于对可靠性要求不高的数据传输。
- 效率低下:发送方必须等待确认才能发送下一个数据,导致传输效率较低。
- 无序传输:发送方发送的数据包在网络中可能以不同的顺序到达接收方。
3. 效率分析停止等待协议的效率主要受以下因素影响:- 传输延迟:发送方等待确认的时间会增加传输延迟。
- 信道利用率:由于发送方必须等待确认,信道可能处于空闲状态,造成信道利用率低。
- 重传次数:若数据出错,发送方需要重传,增加了传输时间和信道占用。
三、协议模拟实现为更好地理解停止等待协议的工作原理,可以进行协议模拟实现。
以下是一个简单的协议模拟实现的示例:1. 发送方实现:发送方需要完成以下步骤:- 将待发送的数据分割成适当大小的数据包。
- 发送数据包,并启动计时器。
- 等待接收方的确认。
- 若接收到确认,则停止计时器,发送下一个数据包。
- 若未接收到确认或接收到否定确认,则重新发送当前数据包。
2. 接收方实现:接收方需要完成以下步骤:- 接收数据包,并发送确认。
- 若接收到的数据包有误,则发送否定确认,要求发送方重新发送该数据包。
- 若接收到的数据包正确,则将数据传递给上层应用。
四、实验结果与分析通过协议模拟实现,可以观察到以下结果:- 传输延迟:发送方等待确认的时间会增加传输延迟,尤其是在网络负载较高的情况下。
- 信道利用率:由于发送方必须等待确认,信道可能处于空闲状态,造成信道利用率低。
测控网络实验指导实验二 利用停止等待协议传输数据文件一、 实验目的✧ 深入理解停止等待协议的主要特点; ✧ 深入理解停止等待协议的工作过程; ✧ 进一步掌握串行口编程的方法。
二、 实验环境该实验可以看成是前一实验的扩展和深入,它要求在串行口上利用停止等待协议实现文件的可靠传输,因此,实验需要的实验环境与实验一(异步串行通信实验)完全相同。
其所需设备、器件及电缆的制作和设备的连接方法可参阅实验一的实验手册。
三、 实验概述1. 停止等待协议图2-1 停止等待协议的基本工作过程 图2-2 数据包的丢失和确认信息的丢失示意图所谓停止等待就是在发送方发完数据报后,需要等待接收方应答信息的到发送数据包接收正确认发送数据包重发数据包发送数据包接收负确认接收正确认接收正确认接收数据包1正确 发送正确认ACK接收数据包2错误 发送负确认NAK接收数据包2正确 发送正确认ACK接收数据包3正确 发送正确认ACK接收方 发送数据包接收正确认发送数据包超时重传数据包超时重传数据包接收正确认接收数据包0正确 发送正确认ACK1接收数据包1正确 发送正确认ACK0接收数据包1正确(抛弃) 发送正确认ACK0接收方发送数据包超时超时来。
如果发送方接收到正确认信息ACK,那么说明接收方已经正确接收到上一数据包,发送方就可以发送下一数据包;如果发送方接收到负责确认信息NAK,说明接收方收到的数据包是错误的,发送方应该重发,如图2-1所示。
为了保证数据传输的可靠性,实际的停等协议并不像上述的那么简单。
在实际应用环境中,至少应该考虑以下两种情况。
(1)数据包丢失数据包在传输过程中丢失,接收方未收到任何数据,如图2-2所示。
由于接收方不知道数据已经发送,因此它不可能给出正确认(ACK)信息或负确认信息(NAK)信息。
为了解决这个问题,发送方需要在发送一个数据包后启动一个定时器。
一旦在规定时间内没有收到接收方的任何信息,则认为数据包丢失,需要重发该数据包。
如果重传一个数据包的次数达到一定值,则认为数据通信信道存在严重问题,数据传输失败。
(2)确认信息丢失或出错接收方正确接收到数据包,但确认信息在传输过程中丢失或出错,如图2-2所示。
这时发送方也不能确定接收方是否收到了数据包。
这个问题的解决也是采用定时器的方法,在定时器溢出后重发数据包。
但是为了保证接收到的数据不重复,需要给数据包编号。
当接收方再次收到同样编号的数据包时,将该包丢弃,并认为上次发送的确认信息丢失或出错,需要重传该确认信息。
对于停等协议,至少需要两个编号(通常为0和1)。
第一个包的编号为0,第二个包的编号为1,第三个包的编号再为0……如果接收方连续收到了相同编号的数据包,则发生了重复,需要将其丢弃。
同时确认信息也需要进行编号,通常用ACK1表示收到编号为0的数据包,并准备接收编号为1的数据包。
同样的,ACK0则表示下一个准备接收到的数据包的编号为0。
2.停止等待协议实例——BSCBSC是一种典型的面向字符型停止等待协议,它使用了ASCII码中的10个控制字符完成通信控制功能,并规定了数据报文、控制报文的格式以及协议的操作过程。
由于规程简单、容易实现,比较适宜在中低速网络(如电话网)中使用。
控制字符:BSC协议中使用的控制字符的符号、名称、ASCII编码及功能说明如表2-1所示。
表2-1 BSC协议中使用的控制字符与功能⏹报文格式BSC协议规定了数据报文格式和控制报文格式。
数据报文格式如图2-3所示,其中SYN为同步字符,接收方在收到2个以上的SYN后就可以进入数据报的接收状态。
报头字段由SOH开始,它是一个可选项,可由用户自己定义,用于存放地址、路径、发送日期等信息。
正文字段由STX开始,其正文字段的长度未作具体规定。
如果正文太长,要将其分成几块传输,每块用ETB结束正文字段。
当全部正文传输结束后,需要用ETX结束正文字段。
BCC为校验字段。
在BSC中,既可以使用奇偶校验,也可以使用CRC 校验。
图2-3 BSC数据报文格式控制报文格式比较简单,基本上是使用一些控制字符序列的组合。
经常使用的控制报文如表2-2所示。
表2-2 BSC常用控制报文及控制字符序列⏹透明数据传输在面向字符协议数据报文中,数据是以字符为单位组成的。
在正文数据中完全可能出现与控制字符代码相同的数据字符,这就会造成误解。
例如,正文中也可能出现与文终字符ETX的代码相同的数据字符。
如果不进行特殊的处理,接收方会误认为是正文结束。
为了解决这个问题,BSC定义了转义字符DLE。
当正文出现与控制字符编码相同的数据字符时,要在数据字符前增加一个DLE。
这样,接收方在收到一个DLE后就可以预知下一个字符是数据字符,而不会把它当作控制字符进行处理。
DLE本身也是控制字符,当它出现在正文中时,也需要增加DLE。
BSC协议的执行过程BSC协议执行过程大致可以分为数据链路建立阶段、数据传输阶段和数据链路拆除阶段。
在正式发送数据之前,发送方通过发送ENQ询问接收方是否同意建立链路,进而进行数据传输。
接收方如果同意则向发送方返回ACK信息;否则返回NAK信息。
在数据链路建立之后,发送方就可以向接收方发送数据报文。
接收方根据接收到数据报文携带的BCC字段来判定数据报文是否接收正确。
如果正确则返回ACK信息;否则返回NAK信息,要求发送方重传。
数据传输完成之后,发送发通过发送EOT拆除链路。
3.简化的停止等待协议实验在不影响停止等待协议基本思想的前提下进行简化,以简化编程过程。
简化的停止等待协议只使用STX、ETX、EOT、ENQ、ACK和DLE6个控制字符,数据报文的格式如图2-4所示。
STX 编号0/1 正文BCC ETX图2-4 简化的停止等待协议数据报文格式每个报文以STX开始,以ETX结束。
报文编号0或1位于STX之后。
正文为可变长度区域,通常为256、512、1024、2048字节等。
BCC是对正文字段的奇偶校验码。
需要发送信息的一方以ENQ请求建立链路。
当收到接收方的ACK0后,发送发就可以开始发送数据报文。
接收方在收到一个数据报后,对其编号和BCC 进行检查,如果正确则返回ACK0(或ACK1)。
如果错误则抛弃该数据报,等待发送方超时后重新发送该报文。
在所有的数据发送完成后,发送方发送EOT 信息,结束本次通信。
四、实验内容与步骤本实验将实现一个基于串行口的文件传输程序。
它可以通过串行口将用户指定的文件从一台计算机发送至另一台计算机,其界面示意图如图2-5所示。
由于本实验要在串口上实现停等协议,因此实验一介绍的有关串口上的数据收发函数和过程也适用于本实验。
此外,在本次实验中需要注意以下问题:1.日志列表该编程实验的主要目的是深入理解停止等待协议的主要特点和工作过程。
因此在程序界面的设计中一定要留有日志位置,以记录发送和接收的整个过程,如图2-5所示。
图2-5 利用停止等待协议实现文件传输程序界面示意图2.日志列表该编程实验的主要目的是深入理解停止等待协议的主要特点和工作过程。
因此在程序界面的设计中一定要留有日志位置,以记录发送和接收的整个过程,如图2-5所示。
3.发送和接收文件的选择选择需要发送的文件或指定需要存储的文件可以使用CFileDialog类。
CFileDialog类的使用方法如下:构造CFileDialog类对象。
CFileDialog类的构造函数如下:explicit CFileDialog(BOOL bOpenFileDialogLPCTSTR lpszDefExt=NULLLPCTSTR lpszFileName=NULLDWORD dwFlags=OFN_HIDEREADONL Y| OFN_OVERWRITEPROMPTLPCTSTR lpszFilter=NULLCWnd* pParentWnd=NULLDWORD dwSize=0);其中各参数主要含义如下:bOpenFileDialog如果设置为TRUE,那么将构造“打开”对话框;如果设置为FALSE,那么将构造“保存为”对话框;LpszDefExt指定默认的扩展名,如果用户在文件名编辑对话框中没有指定扩展名,那么lpszDefExt将自动添加到文件名之后。
如果不希望系统自动添加扩展名,则将该参数置为NULL;lpszFileName为对话框中初始显示的文件名;dwFlags由一个或者多个标志组成,用于对话框的定制,例如标志OFN_HIDEREADONLY告诉系统在显示文件列表时隐藏只读文件;lpszFilter文件名过滤器,用于指定显示在文件列表中的文件类型;pParentWnd指向对话框父窗口的指针;dwSize将由MFC选择合适的值,用户将其值设置为默认值0即可。
✧调用CFileDialog类的成员函数DoModal显示对话框。
✧如果DoModal函数返回值为IDOK,那么可以通过成员函数GetPathName 得到选择或指定文件的完整路径名和文件名。
4.磁盘文件操作可以采用多种不同的方法对磁盘文件进行读写操作,其中最常用的是利用CFile类。
CFile类拥有Open、Read、Write、Close等成员函数,通过这些成员函数可以对磁盘文件进行读写操作。
CFile类的一种主要的使用使用方法如下:✧构造CFile类对象。
✧调用CFile类成员函数Open打开某一特定的文件并指定打开的方式和类型。
成员函数Open的原型如下:virtual BOOL Open(LPCTSTR lpszFileNameUNIT nOpenFlagsCfileException* pError=NULL);其中lpszFileName为指定需要打开文件的文件名和其路径;nOpenFlags定义打开文件的共享模式和存取模式。
这些模式可以通过一系列的标志进行定义,如modeRead为只读模式、modeWrite为只写模式、modeReadWrite为读写模式、typeText指定文件以文本方式打开、typeBinary指定文件以二进制方式打开。
这些标志可以通过|进行组合,用于指定两种以上的模式。
✧在成功打开文件后,利用Read和Write成员函数对文件进行读写操作。
Read和Write的原型如下:virtual UNIT Read(viod * lpBufUNIT nCount);virtual viod Write(const void * lpBufUNIT nCount);在Read和Write函数中,各参数的意义如下:lpBuf指向用于存储读出数据(写入数据)的缓冲区;nCount指明在本次操作中可以读取(写入)的最多字节数。
在对打开的文件进行操作时,Read函数将返回本次操作实际读取的字节数,而Write函数在发生错误(如磁盘满等)时将显示一个例外。