UDP实现可靠文件传输
常用的传输层协议

常用的传输层协议传输层协议是计算机网络中的重要协议之一,它负责在不同主机之间的进程之间提供可靠的数据传输服务。
常用的传输层协议包括TCP和UDP。
本文将对这两种协议进行详细介绍。
一、TCP协议TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。
它能够保证数据传输过程中不丢失、不重复、按序到达,并且具有流量控制和拥塞控制等功能。
1. 连接建立在使用TCP进行数据传输之前,需要先建立连接。
连接建立过程分为三个阶段:SYN、SYN-ACK和ACK。
客户端向服务器发送一个SYN报文,服务器收到后回复一个SYN-ACK报文,客户端再回复一个ACK报文,这样连接就建立成功了。
2. 数据传输在连接建立成功后,客户端和服务器就可以开始进行数据传输了。
TCP通过序列号和确认号来保证数据的可靠性。
发送方将每个字节都编号,接收方收到后会发送确认消息告诉发送方已经收到了哪些字节。
3. 流量控制TCP还具有流量控制功能,可以根据接收方处理能力来控制发送方的发送速度。
接收方会在TCP报文中添加一个窗口大小的字段,告诉发送方还可以接收多少数据。
发送方根据这个信息来控制自己的发送速度,避免造成网络拥塞。
4. 拥塞控制TCP还具有拥塞控制功能,可以根据网络状况来调整自己的发送速度。
如果发现网络出现拥塞,TCP会减小自己的发送速度,避免继续加剧网络拥塞。
二、UDP协议UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议。
它不保证数据传输过程中不丢失、不重复、按序到达,并且没有流量控制和拥塞控制等功能。
但是由于它没有建立连接和进行确认等操作,因此传输效率比TCP高。
1. 无连接UDP是一种无连接的协议,也就是说在进行数据传输之前不需要建立连接。
这样可以减少建立连接和断开连接所需要的时间,提高传输效率。
2. 不可靠UDP是一种不可靠的协议,它不能保证数据传输过程中不丢失、不重复、按序到达。
UDP基本原理

传摘要:UDP是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP协议基本上是IP协议与上层协议的接口。
本文中对UDP协议进行一下具体的讲述,在第一章中将介绍UDP的基本概念,UDP协议的端口,长度和效验及其计算等方面的问题;在第二章中介绍了UDP数据的封装与拆装以及它的应用。
第一章 UDP基本原理1.1 UDP基本概念以及适用范围:1.1.1 UDP的基本概念UDP,即用户数据报协议(User Datagram Protocol)[5]。
作为运输层协议,UDP使用端口号来完成进程到进程之间的通信,UDP在运输层提供非常有限的流控制机制,在收到分组时没有流控制也没有确认。
但是,UDP提供了某种程度的差错控制。
如果UDP检测出在收到的分组有一个差错,它就悄悄的丢弃这个分组。
UDP不负责为进程提供连接机制,它只从进程接收数据单元,并将他们不可靠的交付给接收端。
数据单元必须足够小,能够装进到一个UDP分组中。
所以,UDP提供的是无连接的、不可靠的运输服务。
1.1.2 UDP的适用范围[7](1)UDP适用于需要简单的请求-响应通信,而较少考虑流控制和差错控制的进程;(2)UDP适用于具有内部流控制和差错控制机制的进程。
例如,简单文件传送协议(TFTP)的进程就包括流控制和差错控制,它能够很容易的使用UDP;(3)对多播和广播来说,UDP是个合适的运输协议。
多播和广播能力已经嵌入在UDP软件中,但没有嵌入到TCP软件中;(4)UDP可用于进程管理,如SMTP;(5)UDP可用于某些路由选择更新协议,如路由选择信息协议RIP。
1.1.3 UDP协议的建立以及使用的优点[3]协议是建立在IP协议之上的,从进程的缓冲区输出一个UDP数据报,把生成的UDP数据报直接封装在IP 数据报中进行传输,因此在传输层使用UDP协议时,发送端不需要发送缓冲区,图1所示:IP数据报图1尽管与IP协议类似,UDP提供的也是无连接的,不可靠的数据报传递服务,但是,有别于IP协议的是:1.UDP提供了端到端的通信机制2.增加了对数据区的完整性校验在网络通信中使用UDP协议的好处:在少量数据的传输时,使用UDP协议传输信息流,可以减少TCP连接的过程,提高工作效率。
视频传输协议

视频传输协议一、概述视频传输协议(Video Transport Protocol,VTP)是一种用于视频传输的协议,它负责在网络中传输视频数据,使得视频流能够被发送并在接收者端播放。
随着视频应用的广泛普及,视频传输协议也变得越来越重要。
通过视频传输协议,用户能够在任何时间、任何地点观看自己需要的视频。
同时,视频传输协议也为企业提供了视频会议、远程培训等方便的解决方案。
本文将详细介绍视频传输协议的基本原理、分类、优缺点等内容。
二、基本原理视频传输协议的基本原理是将视频数据拆分成若干个数据包,通过网络传输,再由接收端将数据包重新组合成完整的视频流,最终播放。
为了保证传输的实时性和稳定性,视频传输协议通常采用UDP协议。
UDP协议不像TCP协议那样需要进行确认和重传,因此能够更加快速地传输数据。
但是相比TCP协议,UDP协议对网络质量的要求更高,因为一旦数据包丢失就无法进行重传。
为了提高传输效率和节省网络带宽,视频传输协议还常常采用压缩算法对视频数据进行压缩。
常用的视频压缩算法有H.264、H.265等。
三、分类根据视频传输协议的不同应用场景,可以将其分为实时视频传输协议和文件视频传输协议。
1、实时视频传输协议实时视频传输协议是一种用于视频会议、直播等实时应用的协议。
它能够保证视频的实时性和稳定性,提供较低的延迟和较高的带宽利用率。
目前比较流行的实时视频传输协议有RTP(Real-time Transport Protocol)、RTSP(Real-time Streaming Protocol)等。
RTP协议是一种在UDP协议上建立的实时数据传输协议。
它通过序列号和时间戳等机制保证视频数据的实时性和可靠性,同时支持多个数据流的传输。
RTSP协议是一种用于视频流媒体的协议,能够实现实时视频的点播和直播。
它支持多种流传输方式,包括UDP、TCP、HTTP等,能够适用于不同的网络环境和终端设备。
2、文件视频传输协议文件视频传输协议是一种用于文件视频传输的协议。
可运行在单片机上的UDP通讯协议的实现

简单解释一下上面三个过程。初始化不用解释了。A R P 通讯是整个网络传输的开始,而且只 需要运行一次。在《单片机驱动 D M 9 0 0 0 网卡芯片(详细调试过程)【下】》最后的部分已经讲 清楚了。主要是解释第三条,u d p 通讯收发数据。 O S I 参考模型中 a r p 协议属于链路层(最底层),i p 协议比 a r p 协议高一层属于网络层(这 一层还包括 i c m p 和i g m p 协议),在往上一层是运输层,包括 t c p 协议和 u d p 协议。但是按我的 理解,从数据包格式的角度看,我把 a r p 协议与 i p 协议放在同一级别,我们接收到的数据包中 的前几十个字节用来判断是 a r p 协议还是 i p 协议,也就是说这两个协议是互补相容的(下面程 序中会做个过滤,数据包只接收 a r p 或i p 协议,最后处理的数据包中只能是 a r p 协议或者是 i p 协议)。这种互补相容的协议同样也适用于 t c p 协议和 u d p 协议上。既然有互不相容的协议,那 么也就有相容的协议了,这种相容的协议就是指一个协议必须依赖于另一种协议才能实就像一件外套,u d p 协议好比一件衬衫,而真正的数 据可以看做是穿衣服的人。穿衣服的人先穿上衬衫再穿外套,这两个协议之间的关系就是这样: u d p 协议将数据包起来,i p 协议又将 u d p 协议连同其中的数据一起包起来。也就是说,实际的数 据经过 u d p 协议的包装,在经过 i p 协议的包装之后才能发送出去。虽然看起来有些繁琐,但实 际计算机端就是这样识别数据的。 所谓的包装就是在被包装数据前加上一小段首部数据, 一般几 十个字节左右。 2 、A R P 协议的实现 这部分内容在《单片机驱动 D M 9 0 0 0 网卡芯片(详细调试过程)【下】》的后半部分已经讲 过,这里为了完整性再重复一次。 在写所有协议之前,有些全局变量需要事先设定一下,如 i p 地址、m a c 地址等信息。另外, 统一规定一下我们的单片机系统为“基板”,计算机端为“上位机”,以下叫起来方便。再规定 一下:c h a r 型是 8 位,s h o r t 型是 1 6 位,l o n g 型是 3 2 位。O K ! / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / u n s i g n e dc h a rm y _ m a c a d d r [ 6 ]={0 x 0 0 ,0 x 0 a ,0 x 0 0 ,0 x 0 1 ,0 x 0 2 ,0 x 0 3} ; / / 基板上 m a c 地 址,这里随便写 6 个字节。 u n s i g n e dc h a rm y _ i p a d d r [ 4 ]={1 9 2 ,1 6 8 ,1 ,2 0 7} ; / / 基板上 i p 地址,根据网关写入合适 值。 u n s i g n e dc h a rs e r v e r _ m a c a d d r [ 6 ]={0 x f f ,0 x f f ,0 x f f ,0 x f f ,0 x f f ,0 x f f} ; / / 上位机 m a c 地址,通过 a r p 协议获取后改变。 u n s i g n e dc h a rs e r v e r _ i p a d d r [ 4 ]={ 1 9 2 ,1 6 8 ,1 ,1 2 2 } ; / / 上位机 i p 地址,看自己的电脑, 这个应该会,不会就问问旁边的人吧。 u n s i g n e dc h a rt r a n s m i t _ b u f f e r [ 2 0 4 8 ]={0} ; / / 发送数据包缓存区 u n s i g n e dc h a rr e c e i v e _ b u f f e r [ 2 0 4 8 ]={0} ; / / 接收数据包缓存区 / * 如果为了节省 r a m ,这两个区可以共用一个(因为发送和接收数据可以分开进行,而且一般网 卡芯片内部都会有自己独立的接收和发送缓存的),容量也可以改小,写成“u n s i g n e dc h a r d a t a _ b u f f e r [ 1 0 0 0 ]={0} ; ”我的 r a m 比较多,所以用了两个区,而且占用很大空间。* /
计算机网络应用 UDP协议简介

计算机网络应用UDP协议简介UDP(User Datagram Protocol,用户数据报协议)与TCP协议位于同一层,也是传输层协议。
它是一种无连接的协议,提供面向事物的简单不可靠的信息传输服务。
1.UDP协议特点一般来讲,UDP协议是IP协议与上层协议的接口。
它使用IP层提供的服务将从应用层得到的数据从一台主机的某个应用程序传送给网络上另一台主机上的某个应用程序。
其具有以下几个方面的特点:●无连接UDP是无连接的,即在传输数据前不需要像TCP那样与对方建立连接,发送方与接收方通过相互交换信息使双方达到同步。
●无序UDP不对接收到的数据进行排序,在其报文的首部也并没有定义像TCP所采用的序列号的有关数据顺序的信息。
在传送过程中,报文不一定是按照顺序到达,所以接收端没有也必要对其进行排序。
例如,位于计算机A的应用程序向计算机B发出A1 A2 A3 A4这4个数据报,但是UDP 有可能按照A3 A1 A4 A2的顺序将所接收到的数据提交到计算机B的应用程序。
●无重发UDP接收端在接收到数据报后不对发送端发送确认信号,发送端不了解数据是否被正确接收,也不会重发数据。
●不可靠与TCP不同,UDP协议并不提供对数据传送的保证机制。
即在发送方发送数据给接收方的传递过程中,如果出现数据报的丢失,其并不能做出任何检测或提示。
因此,人们也常将UDP协议称为不可靠的传输协议。
●数据传输速度快与TCP相比,它并不提供对IP协议的可靠机制、流量控制以及错误恢复等功能,因此其数据传输速度快,占用系统资源小。
●UDP信息包标题短与TCP所具有的20个字节信息包相比,UDP信息包仅8个字节。
2.UDP数据报格式UDP数据报包括UDP头部和UDP数据块两部分,其头部又由不同的部分构成,其数据报格式如图3-6所示。
UDP源端口号UDP目的端口号UDP数据报长度UDP校验和UDP数据区32bit16bit图3-6 UDP数据报格式●UDP源端口号该字段占16位,是可选字段,用于标识主机应用程序所使用的端口号。
计算机网络的传输协议

计算机网络的传输协议计算机网络的传输协议是指计算机在网络通信中所采用的规约或协定,用于确保数据的传输和交换能够高效、可靠地进行。
它是计算机网络中重要的组成部分,决定了网络通信的速度、安全性和可靠性。
本文将介绍计算机网络中常用的传输协议,包括TCP/IP协议、UDP协议和HTTP协议。
一、TCP/IP协议TCP/IP协议是计算机网络中最常用的传输协议,它是因特网的基础协议。
TCP/IP协议是一种面向连接的协议,它将数据划分成多个小的数据包,并通过IP地址进行传输。
TCP协议负责数据的可靠传输,确保数据能够完整地、有序地到达目的地。
IP协议则负责将数据包从源地址传输到目的地址。
TCP/IP协议具有很多优点。
首先,它可以自动调整传输速度,根据网络拥塞情况来动态调整数据的传输速率,使得网络能够更好地适应不同的情况。
其次,它提供了强大的错误校验和纠正机制,可以保证数据传输的可靠性。
此外,TCP/IP协议还支持广播和多播等方式,使得信息能够高效地在网络中传播。
二、UDP协议UDP协议是一种面向无连接的传输协议,与TCP/IP协议相比,它更加简单、直接。
UDP协议将数据分成小的数据包进行传输,但不保证数据包的可靠性和顺序,因此在传输过程中可能会有一些丢失或乱序的情况。
UDP协议适用于对实时性要求较高的应用,如音频、视频等流媒体传输。
UDP协议具有低延迟和高扩展性的特点。
由于它不需要进行连接的建立和维护,因此在网络传输过程中的开销较小,可以更快地完成数据的传输。
此外,UDP协议还支持一对多的传输方式,可以同时向多个主机发送数据,提高了网络的传输效率。
三、HTTP协议HTTP协议是一种应用层协议,用于在计算机之间传输超文本数据。
它是基于TCP/IP协议的,使用HTTP协议可以在不同的网络设备之间传递HTML页面、图像、声音、视频等多媒体文件。
HTTP协议是一种无状态协议,即每次的请求和响应之间没有任何关联。
它通过URL来定位资源,并使用请求方法来对资源进行操作,如GET请求获取资源,POST请求提交数据等。
卫星通信网络中的数据传输协议研究
卫星通信网络中的数据传输协议研究随着科技的不断发展和人类对信息传输的不断需求,卫星通信网络已经成为了现代社会中不可或缺的一部分。
在这个庞大的网络中,数据传输协议则成为了连接每个信息节点的桥梁。
本文主要研究卫星通信网络中常见的数据传输协议,并探讨其原理、优缺点和适用范围。
一、协议分类和原理卫星通信网络中常见的数据传输协议主要分为TCP、UDP、HTTP和FTP四类。
其中,TCP(Transmission Control Protocol)是一种可靠的连接协议,它使用三次握手的方法建立连接,并在传输中保证数据的可靠性。
UDP(User Datagram Protocol)则是一种无连接协议,不需要建立连接和保持状态,因为没有连接,所以也就没有可靠性保证。
UDP主要用于一些实时应用,如IP电话、视频会议等。
HTTP(HyperText Transfer Protocol)是一种基于TCP的协议,主要用于传输超文本,如Web网页。
FTP(File Transfer Protocol)则是一种用于文件传输的协议,基于TCP并且需要建立连接。
二、协议优缺点不同的协议在不同的场合下具有不同的优缺点。
TCP协议的优点在于它保证了数据的可靠性,能够在网络传输中避免数据丢失或者错误。
缺点则在于TCP建立连接的过程比较耗时,传输效率不如UDP。
UDP协议的优点在于它能够快速传输数据,适用于实时应用,如IP电话、视频会议等。
缺点则在于UDP不具备可靠性,数据传输中存在丢失或者损坏的风险。
HTTP协议的优点在于它能够在较短的时间内完成页面传输,并且能够嵌入图像、动画等多媒体元素。
缺点则在于HTTP对于高并发的支持不够好,会出现堵塞现象。
FTP协议的优点在于它能够稳定高效地完成文件传输,并提供了完整的控制和状态信息。
缺点则在于FTP的传输速度不如其他协议快,且需要建立连接。
三、协议应用不同的协议在不同的场合下都有着广泛的应用。
网络程序设计6-传输层协议UDP和TCP
TCP连接的建立与关闭
25
传输层协议UDP和TCP
TCP的特点
通信前要建立连接 支持可靠通信 支持拥塞控制 支持流量控制 通信后需要断开连接 只支持一对一通信 数据没有边界(数据流)
26
传输层协议UDP和TCP TCP与UDP的比较
比 较 项 目 建立的连接与关闭 数据传输效率(当网络可靠时) 对数据的确认 流量控制 丢失分组的重发 协议复杂性 发送端缓冲 分组排序 对重复分组的检测 校验和 有 低 有 有(滑动窗口) 有 复杂 有 有 有 有 可能性小(因为在连接建立时, 双方通知各自的 MSS,每个 TCP 报文段的长度不超过 MSS) 不支持(因为它要建立一对一 的连接) 可靠性要求高,有大量数据要 连续传输,该协议在互联网中应 用较多 TCP 无 高 无 无 无(由高层应用程序负责) 简单 无 无 无 有(且算法相同) 可能性大(因 为应用程 序每次 输出都产生一个 UDP 报文, 当一次 有大量数据要输出时,常在低层被 分片) 支持 对可靠性要求一般,但要求高效 传输数据,或应用于数据传输量小 的场合 UDP
在低层被分片情况
广播与多播
适用场合
27
传输层协议UDP和TCP
传输层报文实例
UDP报文
IP 首部显示 后面是 UDP
13
传输层协议UDP和TCP
常用的众所周知的UDP端口号
UDP 端口号 53 67 68 69 161 162 关键词 Domain BootPS BootPC TFTP SNMP SNMP-TRAP 描 域名服务器 引导协议服务器 引导协议客户机 简单文件传输协议 简单网络管理协议 简单网络管理协议陷阱 述
udp协议号是17的记忆方法
udp协议号是17的记忆方法UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议。
UDP 的协议号是17,它与TCP(Transmission Control Protocol)协议号6一起组成了TCP/IP协议族中的两个主要传输协议。
为了记忆UDP协议号是17,我们可以结合UDP协议的特点和一些关联的知识来制定记忆方法。
下面我将从UDP协议的特点、与其他协议的对比、应用场景等方面进行解析和讨论。
首先,UDP协议是一种无连接的协议。
这意味着在传输数据之前,发送端和接收端不需要进行握手和建立连接的过程。
相比之下,TCP协议需要通过三次握手来建立连接,确保可靠的数据传输。
由于UDP无需建立连接,因此在传输速度上具有显著的优势,适用于实时性要求较高的应用场景。
其次,UDP协议是一种不可靠的协议。
这意味着UDP在传输数据时,不保证数据的可靠性和正确性。
与之相对应的是TCP协议,它通过序列号、确认应答等机制来确保数据的可靠传输。
但正是由于UDP协议不保证数据的可靠性,使得UDP具有更低的延迟和更小的网络开销。
因此,UDP常被用于音视频传输、实时通信等不要求100%可靠性的应用场景。
接下来,我们可以借助其他协议和网络知识来记忆UDP的协议号17。
例如,UDP的接口号是17,我们知道以太网帧的最小长度是64字节,那么可以将UDP协议号17与以太网帧的最小长度64关联起来记忆。
除此之外,UDP协议也可以与其他协议相互对应,如HTTP协议使用的端口号是80,将80与17结合起来,可以有助于记忆UDP的协议号。
此外,UDP还有一些特殊的应用场景,可以通过与这些应用场景的关联来记忆UDP的协议号17。
例如,DNS(Domain Name System)是互联网上的域名解析系统,它使用UDP协议的53端口来传输域名解析请求和响应,通过与DNS 协议的端口号关联,可以记忆UDP的协议号17。
传输协议有哪些
传输协议有哪些传输协议是计算机网络中用于在不同主机之间传输数据的规定和约束的集合。
它是实现信息的可靠传输和有效管理的基础。
以下是一些常见的传输协议。
1. Transmission Control Protocol (TCP): TCP 是最常用的传输协议之一,它提供了可靠的、面向连接的数据传输方式。
它通过将数据分割成小的片段,并在接收方重新组装这些片段来确保数据的准确传输。
TCP 还负责处理数据的错误校验和重传等问题,以确保数据的完整性和可靠性。
2. User Datagram Protocol (UDP): UDP 是另一种常用的传输协议。
与 TCP 不同,UDP 是一种无连接的传输协议,不提供可靠的数据传输机制。
它更适合用于实时应用程序,如音频和视频传输,因为它具有较低的延迟和资源占用。
3. Internet Protocol (IP): IP 是一种网络层协议,不仅用于传输数据,还负责数据包的路由和寻址等任务。
IP通过一组规则和约定来确保数据包的正确传输。
它使用 IP 地址来唯一标识主机,并使用路由表来确定如何将数据包传递到目标主机。
4. HyperText Transfer Protocol (HTTP): HTTP 是用于在万维网上传输超文本文档的协议。
它基于客户端-服务器模型,客户端向服务器发送请求,并接收服务器返回的响应。
HTTP 使用TCP 作为其传输协议,通过使用标准化的请求和响应格式来支持不同类型的内容传输。
5. File Transfer Protocol (FTP): FTP 是用于在计算机之间传输文件的一种传输协议。
它允许用户通过将文件从一个设备复制到另一个设备来实现文件的远程访问和传输。
FTP 使用 TCP 协议来确保文件的可靠传输。
6. Simple Mail Transfer Protocol (SMTP): SMTP 是用于在电子邮件系统中传输邮件的协议。
它定义了如何将邮件从一个邮件服务器传输到另一个邮件服务器的规则和格式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
采用滑动窗口协议,限制已发送出去但未被确认的数据帧的数目。循环重复使用已收到的那些数据帧的序号。具体实现是在发送端和接收端分别设定发送窗口和接收窗口。 (1)发送窗口 发送窗口用来对发送端进行流量控制。发送窗口的大小Wt代表在还没有收到对方确认的条件下,发送端最多可以发送的数据帧的个数。具体意思请参考下图:
(2)接收窗口 接收窗口用来控制接收数据帧。只有当接收到的数据帧的发送序号落在接收窗口内,才允许将该数据帧收下,否则一律丢弃。接收窗口的大小用Wr来表示,在连续ARQ协议中,Wr = 1。接收窗口的意义可参考下图:
在接收窗口和发送窗口间存在着这样的关系:接收窗口发生旋转后,发送窗口才可能向前旋转,接收窗口保持不动时,发送窗口是不会旋转的。这种收发窗口按如此规律顺时钟方向不断旋转的协议就犯法为滑动窗口协议。
好了,在上面对滑动窗口协议有大致了解后,我们还是进入正题吧:) 发送端的发送线程: int ret; int nPacketCount = 0; DWORD dwRet; SendBuf sendbuf; DWORD dwRead; DWORD dwReadSize;
SendBuf* pushbuf; //计算一共要读的文件次数,若文件已读完,但客户端没有接收完, //则要发送的内容不再从文件里读取,而从m_bufqueue里提取 nPacketCount = m_dwFileSize / sizeof(sendbuf.buf);
//若不能整除,则应加1 if(m_dwFileSize % sizeof(sendbuf.buf) != 0) ++nPacketCount;
SetEvent(m_hEvent); CHtime htime; //若已发送大小小于文件大小并且发送窗口前沿等于后沿,则继续发送 //否则退出循环
if(m_dwSend < m_dwFileSize) // 文件没有传输完时才继续传输 { while(1) { dwRet = WaitForSingleObject(m_hEvent, 1000); if(dwRet == WAIT_FAILED) { return false; } else if(dwRet == WAIT_TIMEOUT) { //重发 ::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue的排斥区 ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf)); ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区 if(ret == SOCKET_ERROR) { cout << "重发失败,继续重发" << endl; continue; }
ResetEvent(m_hEvent); continue; }
//若发送窗口大小 < 预定大小 && 已读文件次数(nReadIndex) < 需要读文件的次数(nReadCount),则继续读取发送 //否则,要发送的内容从m_bufqueue里提取 if(m_dwSend < m_dwFileSize) { dwReadSize = m_dwFileSize - m_dwSend; dwReadSize = dwReadSize < MAXBUF_SIZE ? dwReadSize : MAXBUF_SIZE;
memset(sendbuf.buf, 0, sizeof(sendbuf.buf)); if(!ReadFile(m_hFile, sendbuf.buf, dwReadSize, &dwRead, NULL)) { //AfxMessageBox("读取文件失败,请确认文件存在或有读取权限."); cout << "读取文件失败,请确认文件存在或有读取权限." << endl; return false; }
m_dwSend += dwRead; sendbuf.index = m_nSendIndexHead; m_nSendIndexHead = (m_nSendIndexHead + 1) % Sliding_Window_Size; // 发送窗口前沿向前移一格
sendbuf.dwLen = dwRead; //保存发送过的数据,以便重发 ::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue的排斥区 pushbuf = GetBufFromLookaside();
memcpy(pushbuf, &sendbuf, sizeof(sendbuf)); m_bufqueue.push(pushbuf); if(m_dwSend >= m_dwFileSize) // 文件已读完,在队列中加一File_End标志,以便判断是否需要继续发送 { pushbuf = GetBufFromLookaside();
pushbuf->index = File_End; pushbuf->dwLen = File_End; memset(pushbuf->buf, 0, sizeof(pushbuf->buf));
m_bufqueue.push(pushbuf); } ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区 }
::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue的排斥区 if(m_bufqueue.front()->index == File_End) // 所有数据包已发送完毕,退出循环 { ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区 break; } else if(m_bufqueue.size() <= Send_Window_Size) // 发送窗口小于指定值,继续发送 { ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf)); if(ret == SOCKET_ERROR) { ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区 cout << "发送失败,重发" << endl; continue; }
//延时,防止丢包 Sleep(50); } else // 发送窗口大于指定值,等持接收线程接收确认消息 { ResetEvent(m_hEvent); } ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区 } }
发送端的接收线程: int ret; RecvBuf recvbuf; while(m_hFile != NULL) { ret = m_hsocket.hrecvfrom((char*)&recvbuf, sizeof(recvbuf)); if(ret == SOCKET_ERROR) { //AfxMessageBox("接收确认消息出错"); ::EnterCriticalSection(&m_csQueue); if(m_bufqueue.front()->index == File_End) // 文件传输完毕 { ::LeaveCriticalSection(&m_csQueue); break; } ::LeaveCriticalSection(&m_csQueue);
cout << "接收确认消息出错: " << GetLastError() << endl; return false; }
if(recvbuf.flag == Flag_Ack && recvbuf.index == m_nSendIndexTail) { m_nSendIndexTail = (m_nSendIndexTail + 1) % Sliding_Window_Size;
//该结点已得到确认,将其加入旁视列表,以备再用 ::EnterCriticalSection(&m_csQueue); m_bufLookaside.push(m_bufqueue.front()); m_bufqueue.pop(); ::LeaveCriticalSection(&m_csQueue);
SetEvent(m_hEvent); } }
接收端的接收线程: int ret; DWORD dwWritten; SendBuf recvbuf; RecvBuf sendbuf; int nerror = 0;
// 设置文件指针位置,指向上次已发送的大小 SetFilePointer(m_hFile, 0, NULL, FILE_END);
//若已接收文件大小小于需要接收的大小,则继续 while(m_dwSend < m_dwFileSize) { //接收 memset(&recvbuf, 0, sizeof(recvbuf));