求 扩展UDP实现SR可靠数据传输 的java程序...网络工程专业作业

.UDP向应用层提供不可靠数据传输服务,本课题的任务是扩展UDP的服务,使其对应用层提供采用SR(选择重传)的可靠的数据传输服务。
2.可靠数据传输机制设计:
  2.1 UDP不可靠数据传输服务抽象;
  2.2扩展UDP实现SR可靠数据传输:
   2.2.1 如何体现流水线机制?
   2.2.1 如何应对传输过程中的错误,实现SR?
   2.3可靠数据传输机制的验证系统。

课设大作业....小弟在这跪求一份....下周就要交了 实在没时间做了 !! 跪谢了啊 ...有的麻烦传一份 积分下载也行...

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
UDP实现可靠数据传输
UDP没有Delievery   Garuantee,也没有顺序保证,所以如果你要求你的数据发送与接受既要高效,又要保证有序,收包确认等,你就需要在UDP协议上构建自己的协议。比如RTCP,RTP协议就是在UPD协议之上专门为H.323协议簇上的IP电话设计的一种介于传输层和应用层之间的协议。 下面分别介绍三种使用UDP进行可靠数据传输的协议 RUDP RTP UDT R
流水线可靠数据传输GBN和SR
eg.数据链路层采用后退N帧(GBN)协议,发送方已经发送了编号为 0~7的帧。当计时器超时时,若发送方只收到0、1、5号帧的确认,则发送方需要重发的帧数是多少?分别是那几个帧?根据GBN协议工作原理,GBN协议的确认是累积确认,所以此时发送端需要重发的帧数是5个,依次分别是6、7号帧。解释一下什么是累积确认:接收方不必对收到的分组逐个发送确认,而是可以在收到几个分组后,对一个有序到达的最后一个分...
用UDP实现的可靠数据传输
最近工作需要写了一个用UDP封装的可靠数据传输。rnrn在点对点模式下传输速度为3-4Mrn广播方式下为1M左右。rnrn所有的实现都封装在一个dll中。rnrn但测试程度界面很难看没有把发送数据的当前流量等信息反应出来rnrn只能在局网内使用。有感兴趣的可发一份可执行程序给你们!
help!!!如何实现基于UDP的可靠数据传输???
大侠们,帮帮我,不知道该怎么写
GBN,SR,TCP协议实现可靠数据传输的原理
第一题 假设主机A向主机B发送5个连续的报文段,主机B对每个报文段进行确认,其中第二个报文段丢失,其余报文段以及重传的第二个报文段均被主机B正确接收,主机A正确接收所有ACK报文段;报文段从1开始依次连续编号(即1、2、3……),主机A的超时时间足够长。请回答下列问题: 1).如果分别采用GBN、SR和TCP协议,则对应这三个协议,主机A分别总共发了多少个报文段?主机B分别总共发送了多少个ACK...
可靠数据传输
一.介绍三种使用UDP进行可靠数据传输的协议 RUDP RTP UDT RUDP(Reliable User Datagram Protocol) 可靠用户数据报协议(RUDP)是一种基于可靠数据协议(RDP: RFC908 和 1151 (第二版))的简单分组传输协议。作为一个可靠传输协议,RUDP 用于传输 IP 网络间的电话信号。它允许独立配置每个连接属性,这样在不同的平台
网络工程专业
我是刚上的网络工程专业;虽说已经是大二了可是对网络工程这个专业还是不明白。烦劳哪位大虾能帮我疏导疏导;如果不嫌小弟我麻烦的话,能告诉我学习网络工程这个专业应给先看哪些书籍呢?。。。。。。。。小弟拜上!不胜感激
一个基于UDP的可靠数据传输库
A UDP-based Reliable Data Transfer Library 一个基于UDP的可靠数据传输库   Introduces an open source UDP-based data transfer library. 介绍了一个开源的基于UDP的输出传输库。 Introduction 简介 This article introduces an open sour
UDP实现可靠传输
如何让UDP实现可靠传输自定义通讯协议,在应用层定义一些可靠的协议,比如检测包的顺序,重复包等问题,如果没有收到对方的ACK,重新发包UDP没有Delievery Garuantee,也没有顺序保证,所以如果你要求你的数据发送与接受既要高效,又要保证有序,收包确认等,你就需要在UDP协议上构建自己的协议。比如RTCP,RTP协议就是在UPD协议之上专门为H.323协议簇上的IP电话设计的一种介于传...
可靠UDP传输协议的实现
可靠UDP传输协议的实现 RUDP is an object-oriented implementation of a reliable, in-order, transport protocol over UDP based on the Internet Draft by Bova, Krivoruchka, and Cisco Systems (1999) titled "Reliable UDP".
实现UDP可靠文件传输
在网上搜到的C#实现的UDP文件传输代码,分享给大家。局域网下速度能达到5,6M,效率还可以
UDP实现可靠的文件传输
自己写的额外代码来保障UDP可靠的文件传输 解决UDP传输丢包问题。
可靠UDP实现代码
Linux下 UDP可靠数据传输实现代码
可靠UDP传输的实现
本项目是创新实验课最后的大实验,开发了一个可靠的UDP传输系统,采用了应答响应的思路,也就是TFTP的基本原理。整个开发过程全部使用的最简单易懂的代码,本人学习java网络编程也就用了一两周吧,但有一些c语言套接字编程经验。建议初次学习java套接字的可以参考一下。压缩包中附带有答辩ppt,可以先看一下ppt就知道整个系统实现的步骤了。
可靠UDP传输的实现!
一直纠结于UDP的可靠传输,在查看了UDT的相关介绍后,发现并不是我需要的,我需要的是一个可以进行多点传输的的可靠UDP。最终,还是自己慢慢把它完成了,虽然还不够好,不过总算出来个框架了,以后改就容易了 。rn 在算法上并没有什么特别的,就是不断的采用超时重发机制。在发送端,建立了一个庞大的发送缓冲区队列,每个发送过的发送单元都将自动被添加到这个发送缓冲区中,然后由维护线程来管理。在维护线程中,定时遍历所有的发送缓冲区,检查那些没有被确认且还没达到发送最大值限制的发送单元,然后将它们发送出去,以此类推,直到所有的发送单元都被确认或者都达到发送最大值限制。请看下面的发送单元结构: [code=C/C++] rn//发送单元rntypedef struct _UDT_SND_ITEM_rnrn USHORT uBufLen; //chBuf的数据长度rn USHORT uLimitCnt; //发送次数限制rn SOCKET hSock; //UDP句柄rn CHAR chBuf[DATA_BUFSIZE]; //要发送的数据,UDT头 + 数据rn DWORD dwLastTime; //最后发送时间(如果为0xFFFFFFFF则表示已经确认)rn SOCKADDR_IN To; //发送的目的地rnUDT_SND_ITEM;[/code]在CUDTSend类中的变量 DWORD * m_pdwPos是用来维护发送单元的集合,当UDTSend函数将一个要发送的数据包拆分成独立的发送单元并发送时,都会依据这个发送单元的序号将该发送单元添加到m_pdwPos集合中,使该集合中的对应序号的地址就是这个发送单元。目前这个发送缓冲区的最大容量使65536,也就是最大可以存储65536个未确认的发送单元。rn 相比之下,接收类的设计就显的比较复杂,因为接收类要考虑来自不同主机所发送过来的数据,还要考虑每个主机发送的不同数据包,并且就算是同一个数据包,也还要按顺序接收每个单元数据,在组合这些单元数据为一个整数据包,针对以上问题,我通过定义以下的数据结构来完成功能:rn[code=C/C++]//接收包单元rntypedef struct _UDT_RECV_ITEM_rnrn DWORD dwSeq; //序号rn DWORD uRecvLen; //数据长度rn CHAR chBuf[DATA_SNDSIZE]; //数据部分rnUDT_RECV_ITEM;[/code]rnrn rn[code=C/C++]rn//数据包(接收单元的组合)rntypedef struct _UDT_RECV_ITEMS_rnrn DWORD dwSeqSpan; //包序号区间rn USHORT uPacketCount; //包数量来自于包区间序号相减rn USHORT uRecvCount; //已经接收的包数量rn DWORD dwLastTime; //最后接收到包的时间rn CCriticalSection cs_item; //接收单元同步对象rn DWORD dwItemPos[1024]; //所有接收包单元集合rn _UDT_RECV_ITEMS_ * ItemsNext; //指向下一个ITEMS结构rnUDT_RECV_ITEMS;[/code]rn[code=C/C++]rn//主机结点(每个接收的主机信息)rntypedef struct _UDT_RECV_PEER_rnrn SOCKADDR_IN Peer; //发送端rn DWORD dwLastTime; //最后更新时间rn CCriticalSection cs_items; //包表示同步对象rn _UDT_RECV_ITEMS_ * ItemsNext; //指向下一个ITEMS结构rn _UDT_RECV_PEER_ * PeerNext; //指向下一个节点rnUDT_RECV_PEER;[/code]rn以上三个结构通过以下示意图的方式连接起来,实现收包的功能rnUDT_RECV_PEER ——> UDT_RECV_PEER ——> UDT_RECV_PEER ——>....... rn | rn | rn VrnUDT_RECV_ITEMS——>UDT_RECV_ITEM——>UDT_RECV_ITEM——>......rn |rn |rn VrnUDT_RECV_ITEMSrn |rn |rn VrnUDT_RECV_ITEMSrn |rn |rn Vrn ......rnrn以上示意图的意思是说,如果收到的数据包来自不同的主机节点都会添加一个UDT_RECV_PEER节点形成一个主机节点链表,针对与每个主机可能会收到不同的数据包,采用在主机节点下串联UDT_RECV_ITEMS结构的方法存放数据包,针对每个接收包单元会存放在UDT_RECV_ITEMS结构下的dwItemPos[1024]成员中,该成员的每个元素都可以用来存放UDT_RECV_ITEM接收单元。以这样的结构来完成数据包的可靠接收,并完成从单一的接收单元组合成完整的数据包的过程,这整个过程都通过调用CUDTRecv类的UDTRecv函数来完成,该函数完成了从接收数据,到发送确认,再到存储接收单元,最后实现组包这一系列过程,并通过输出参数将接收到的数据包返回给调用者。rnrn 综合以上的说明,不难看出,虽然实现了可靠传输,但是并没有实现完全的可靠传输,因为受到发送缓冲的序号限制,最大只能同时存在65536个发送包,也就是说如果在整个发送过程中同时存在的未确认包超过这个限制,就会使发送包出现错误,并导致数据无法可靠传输;而且由于是尽可能的可到传输(限次发送),所以如果遇到网络情况恶劣的情况下,可能会导致部分发送数据超过发送最大值限制而被清除;因此这里介绍的可到传输以及相关代码只是实现了一个框架,并可以满足大部分情况,如果要满足所有情况,则需要不断的修改完善。rnrn相关代码:[url=http://download.csdn.net/source/2819366]点击下载[/url]
可靠UDP的一个实现
可靠UDP的一个实现,包括客户端与服务器端
UDP实现可靠通讯
简单明了的使用udp可靠传送,有参考意义
udp实现可靠传输
做项目正好需要用可靠传输UDP来做传输层,基本思路还是在应用层模仿TCP,超时重传,滑动窗口等机制,三次握手,四次挥手过于复杂,简化成了2次握手,仅确认SEQ或者ACK,如果没有收到正确的报文则重传报文。数据包在发送之前会先存到数据队列,实现缓存,每次发包从数据去取,超时重传时间,超时重传最大次数也要设置,以防止进程被阻塞。 ...
实现可靠数据传输的主要机制
实现可靠数据传输不仅涉及到传输层,还涉及到应用层和链路层。以TCP协议为例,TCP协议提供可靠数据传输,然而网络层不提供可靠数据传输,而是尽最大努力交付,因而,如何在不可靠传输的下层上边实现可靠数据传输的上层是一个复杂的问题。图1 可靠数据传输:服务模型和服务实现首先考虑最简单的情况:可靠的传输频道是完美的,不会出现任何bit错误或者顺序错误。在这种情况下,用有限状态机(FSM)来表示可靠的协议如...
求C++实现的UDP可靠传输的代码
rn764499604@qq.comrn 因为最近在做视频传输,用到了多播,但是发数据时,总是收不到。现在这个问题很难解决rn,就来求助下。
socket实现UDP数据传输
UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 特点:每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。 UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次
UDP实现网络数据传输
客户端代码 #include #include #include #include #include #include #include #include #include int main(int arg, char *args[]) { if (arg < 3) { return -1; } int st = socket(AF_INET, SOCK_D
WINCE6.0 下实现UDP数据传输
在PB6.0 下开发wince的UDP传输程序。
udp实现数据传输的问题
想用Java实现简单的UDP数据传输 但是服务器端老报错 Address already in use: Cannot bindrn下面是代码 帮忙看下 谢谢rn/******************客户端**********************************/rnpublic static void main(String[] args) throws java.io.IOExceptionrn rn rn String localhost ="192.168.108.200";rn rn BufferedInputStream inFromUser = rn new BufferedInputStream(new FileInputStream("c:\\test.txt"));rn rn DatagramSocket clientSocket = new DatagramSocket();rn InetAddress IPAddress = InetAddress.getByName(localhost);rn rn byte[] sendData = new byte[1024];rn byte[] receiveData = new byte[1024];rn //read data from inFromUser to sendDatarn while(inFromUser.read(sendData)!=-1)rn rn DatagramPacket sendPacket = rn new DatagramPacket(sendData, sendData.length, IPAddress, 8000);rn clientSocket.send(sendPacket);rnrn rn inFromUser.close();rn clientSocket.close();rn rnrnrnrn/***********************服务器端********************/rnrn public static void main(String[] args) throws Exception rn rn BufferedOutputStream bufferedOutputStream = rn new BufferedOutputStream(new FileOutputStream("d:\\test.txt"));rn DatagramSocket serverSocket = new DatagramSocket(8000);rn byte[] receiveData = new byte[1024];rn byte[] sendData =new byte[1024];rn rn DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);rn serverSocket.receive(receivePacket);rn rn while(true)//循环的条件不知道该怎么定就用true了rn rn bufferedOutputStream.write(receivePacket.getData());rn rn rn
NIO实现UDP数据传输
最近用NIO写了一个UDP传输,服务器和客户端都存在,测试了并发数至少1000NIO写UDP----server用NIO写UDP/////////serverTest.javaimport java.io.*;import java.net.*;import java.nio.*;import java.lang.*;import java.nio.channe
基于udp的可靠数据传输如何实现呢?求助!!
怎么实现基于udp的可靠数据传输呢,望大虾指点迷津!
求教?如何用udp实现稳定可靠的数据传输阿。
求实现要点及关键api。rn
可靠UDP
1.RakNet 2.udt 3.enet  4.vtcp 5 rudp
tcp 和 udp 的区别 ,及 udp 实现可靠传输
tcp 和 udp 的区别 ,及 udp 实现可靠传输 首先是全 英文 tcp: Transmission Control Protocol (传输控制协议)                          udp: User Datagram Protocol (用户数据包协议) 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建
UDP如何实现可靠传输
要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的超时重传,有序接受,应答确认,滑动窗口流量控制等机制,等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法,在服务器端进行应答确认机制,这样就会保证不可靠的UDP协议进行可靠的数据传输,不过这好像也是一个难题!>要使用UDP来构建可靠的面向连接的数
怎样实现UDP可靠传输
相对于TCP,由于UDP是面向无连接、不可靠的传输协议。 如果我们要用UDP去实现可靠的传输,则需要解决两个问题:丢包和后发先至(包的顺序)。解决方法: 1)给数据包编号,按照包的顺序接收并存储; 2)接收端接收到数据包后发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包,如果接收端收到的数据包的编号不是期望的编号,则要求发送端重新发送。下面是一个示例程序: 该程序定义一个包的结
UDP实现TCP可靠传输
udp与tcp的区别 TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 使用超时重传、数据确认、滑动窗口等方式确保数据包被正确地发送至目的端 UDP是(User Datagram Protocol 用户数据报协议),一种无连接的、不可靠的、基于数据报的传输层协议,提供面向事务的简单不可靠信息传送服务。 可靠性由...
实现UDP的可靠文件传输 练习
# include # include # include # include # include # include # include # include # include # include # include # include # define PORT 8000 # define BUFFER_SIZE 1024 # define
用UDP实现可靠文件传输
                                                                                                 用UDP实现可靠文件传输        大家都清楚,如果用TCP传输文件的话,是很简单的,根本都不用操心会丢包,除非是网络坏了,就得重来。用UDP的话,因为UDP是不可靠的,所以用它传输文件,要保证不丢包,
实现可靠的UDP传输类
实现可靠的UDP传输。虽然名字叫UDT,但是和UDT有着本质区别(主要是不想费脑筋取名字),它可以像UDP一样实现多点自由传输,而无需像UDT那样必须建立服务器,然后等待连接然后在传输。 所用原理就是简单的 确认 + 超时重发机制。
[网络协议]UDP实现的可靠协议
UDP实现的可靠协议,基本都会对TCP的某一部分进行加强,另外一部分进行削弱。因为: “实时性+可靠性+公平性” 三者不能同时保证,因此可以牺牲TCP的局部公平性来换取更好的实时性,或者更浪费点带宽,来实现更低的延迟。 看一个很有趣的问题: QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现 转载于:https://www.cnblogs.com/AndrewYin/p/9202550...
UDP实现可靠文件传输.doc
UDP实现可靠文件传输.doc UDP实现可靠文件传输.doc
UDP实现可靠文件传输(转)
1 UDP实现可靠文件传输n 2 大家都清楚,如果用TCP传输文件的话,是很简单的,根本都不用操心会丢包,除非是网络坏了,就得重来。用UDP的话,因为UDP是不可靠的,所以用它传输文件,要保证不丢包,就得我们自己写额外的代码来保障了。本文就说说如果保证可靠传输。n 3 n 4 要实现无差错的传输数据,我们可以采用重发请求(ARQ)协议,它又可分为连续ARQ协议、选择重发ARQ协议、滑动窗口协议。本文重点介绍滑动窗口协议,其它的两种有兴趣的可参考相关的网络通信之类的书。n 5 n 6 采用滑动窗口协议,限制已发送出去但未被确认的数据帧的数目。循环重复使用已收到的那些数据帧的序号。具体实现是在发送端和接收端分别设定发送窗口和接收窗口。n 7 (1)发送窗口n 8 发送窗口用来对发送端进行流量控制。发送窗口的大小Wt代表在还没有收到对方确认的条件下,发送端最多可以发送的数据帧的个数。具体意思请参考下图:n 9 n 10 n 11 (2)接收窗口n 12 接收窗口用来控制接收数据帧。只有当接收到的数据帧的发送序号落在接收窗口内,才允许将该数据帧收下,否则一律丢弃。接收窗口的大小用Wr来表示,在连续ARQ协议中,Wr = 1。接收窗口的意义可参考下图:n 13 n 14 n 15 在接收窗口和发送窗口间存在着这样的关系:接收窗口发生旋转后,发送窗口才可能向前旋转,接收窗口保持不动时,发送窗口是不会旋转的。这种收发窗口按如此规律顺时钟方向不断旋转的协议就犯法为滑动窗口协议。n 16 n 17 好了,在上面对滑动窗口协议有大致了解后,我们还是进入正题吧:)n 18 n 19 发送端的发送线程:n 20 int ret;n 21 int nPacketCount = 0;n 22 DWORD dwRet;n 23 SendBuf sendbuf;n 24 DWORD dwRead;n 25 DWORD dwReadSize;n 26 n 27 SendBuf* pushbuf;n 28 n 29 //计算一共要读的文件次数,若文件已读完,但客户端没有接收完,n 30 //则要发送的内容不再从文件里读取,而从m_bufqueue里提取n 31 nPacketCount = m_dwFileSize / sizeof(sendbuf.buf);n 32 n 33 //若不能整除,则应加1n 34 if(m_dwFileSize % sizeof(sendbuf.buf) != 0)n 35 ++nPacketCount;n 36 n 37 SetEvent(m_hEvent);n 38 n 39 CHtime htime;n 40 n 41 //若已发送大小小于文件大小并且发送窗口前沿等于后沿,则继续发送n 42 //否则退出循环n 43 n 44 if(m_dwSend < m_dwFileSize) // 文件没有传输完时才继续传输n 45 n 46 while(1)n 47 n 48 dwRet = WaitForSingleObject(m_hEvent, 1000);n 49 if(dwRet == WAIT_FAILED)n 50 n 51 return false;n 52 n 53 else if(dwRet == WAIT_TIMEOUT)n 54 n 55 //重发n 56 ::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue的排斥区n 57 ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf));n 58 ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区n 59 if(ret == SOCKET_ERROR)n 60 n 61 cout << "重发失败,继续重发" << endl;n 62 continue;n 63 n 64 n 65 ResetEvent(m_hEvent);n 66 continue;n 67 n 68 n 69 //若发送窗口大小 < 预定大小 && 已读文件次数(nReadIndex) < 需要读文件的次数(nReadCount),则继续读取发送n 70 //否则,要发送的内容从m_bufqueue里提取n 71 if(m_dwSend < m_dwFileSize)n 72 n 73 dwReadSize = m_dwFileSize - m_dwSend;n 74 dwReadSize = dwReadSize < MAXBUF_SIZE ? dwReadSize : MAXBUF_SIZE;n 75 n 76 memset(sendbuf.buf, 0, sizeof(sendbuf.buf));n 77 if(!ReadFile(m_hFile, sendbuf.buf, dwReadSize, &dwRead, NULL))n 78 n 79 //AfxMessageBox("读取文件失败,请确认文件存在或有读取权限.");n 80 cout << "读取文件失败,请确认文件存在或有读取权限." << endl;n 81 return false;n 82 n 83 n 84 m_dwSend += dwRead;n 85 n 86 sendbuf.index = m_nSendIndexHead;n 87 m_nSendIndexHead = (m_nSendIndexHead + 1) % Sliding_Window_Size; // 发送窗口前沿向前移一格n 88 n 89 sendbuf.dwLen = dwRead;n 90 n 91 //保存发送过的数据,以便重发n 92 ::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue的排斥区n 93 pushbuf = GetBufFromLookaside();n 94 n 95 memcpy(pushbuf, &sendbuf, sizeof(sendbuf));n 96 n 97 m_bufqueue.push(pushbuf);n 98 if(m_dwSend >= m_dwFileSize) // 文件已读完,在队列中加一File_End标志,以便判断是否需要继续发送n 99 n100 pushbuf = GetBufFromLookaside();n101 n102 pushbuf->index = File_End;n103 pushbuf->dwLen = File_End;n104 memset(pushbuf->buf, 0, sizeof(pushbuf->buf));n105 n106 m_bufqueue.push(pushbuf);n107 n108 ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区n109 n110 n111 ::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue的排斥区n112 if(m_bufqueue.front()->index == File_End) // 所有数据包已发送完毕,退出循环n113 n114 ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区n115 break;n116 n117 else if(m_bufqueue.size() <= Send_Window_Size) // 发送窗口小于指定值,继续发送n118 n119 ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf));n120 if(ret == SOCKET_ERROR)n121 n122 ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区n123 cout << "发送失败,重发" << endl;n124 continue;n125 n126 n127 //延时,防止丢包n128 Sleep(50); n129 n130 else // 发送窗口大于指定值,等持接收线程接收确认消息n131 n132 ResetEvent(m_hEvent);n133 n134 ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue的排斥区n135 n136 n137 n138 发送端的接收线程:n139 int ret;n140 RecvBuf recvbuf;n141 n142 while(m_hFile != NULL)n143 n144 ret = m_hsocket.hrecvfrom((char*)&recvbuf, sizeof(recvbuf)); n145 if(ret == SOCKET_ERROR)n146 n147 //AfxMessageBox("接收确认消息出错");n148 ::EnterCriticalSection(&m_csQueue);n149 if(m_bufqueue.front()->index == File_End) // 文件传输完毕n150 n151 ::LeaveCriticalSection(&m_csQueue);n152 break;n153 n154 ::LeaveCriticalSection(&m_csQueue);n155 n156 cout << "接收确认消息出错: " << GetLastError() << endl;n157 return false;n158 n159 n160 if(recvbuf.flag == Flag_Ack && recvbuf.index == m_nSendIndexTail)n161 n162 m_nSendIndexTail = (m_nSendIndexTail + 1) % Sliding_Window_Size;n163 n164 //该结点已得到确认,将其加入旁视列表,以备再用n165 ::EnterCriticalSection(&m_csQueue);n166 m_bufLookaside.push(m_bufqueue.front());n167 m_bufqueue.pop();n168 ::LeaveCriticalSection(&m_csQueue);n169 n170 SetEvent(m_hEvent);n171 n172 n173 n174 接收端的接收线程:n175 int ret;n176 DWORD dwWritten;n177 SendBuf recvbuf;n178 RecvBuf sendbuf;n179 int nerror = 0;n180 n181 // 设置文件指针位置,指向上次已发送的大小n182 SetFilePointer(m_hFile, 0, NULL, FILE_END);n183 n184 //若已接收文件大小小于需要接收的大小,则继续n185 while(m_dwSend < m_dwFileSize)n186 n187 //接收n188 memset(&recvbuf, 0, sizeof(recvbuf));n189 ret = m_hsocket.hrecvfrom((char*)&recvbuf, sizeof(recvbuf));n190 if(ret == SOCKET_ERROR)n191 n192 return false;n193 n194 n195 //不是希望接收的,丢弃,继续接收n196 if(recvbuf.index != (m_nRecvIndex) % Sliding_Window_Size)n197 n198 nerror++;n199 cout << recvbuf.index << "error?" << m_nRecvIndex << endl;n200 continue;n201 n202 n203 if(!WriteFile(m_hFile, recvbuf.buf, recvbuf.dwLen, &dwWritten, NULL))n204 n205 //AfxMessageBox("写入文件失败");n206 cout << "写入文件失败" << endl;n207 return false;n208 n209 n210 //已接收文件大小n211 m_dwSend += dwWritten;n212 n213 //发送确认消息n214 sendbuf.flag = Flag_Ack;n215 sendbuf.index = m_nRecvIndex;n216 n217 ret = m_hsocket.hsendto((char*)&sendbuf, sizeof(sendbuf));n218 if(ret == SOCKET_ERROR)n219 n220 return false;n221 n222 n223 //接收窗口前移一格n224 m_nRecvIndex = (m_nRecvIndex + 1) % Sliding_Window_Size;n225 n226n[align=right]--reply by [url=http://www.csharpwin.com/csharpresource/12290r5015.shtml]CSDN Study Trial V1.0.1[/url] (starts_2000)[/align]
C#实现UDP的可靠传输
在网上看了很多材料。都说做标记啦,或者在包头加个字节长度啦。之类的很多。叫我说我也能说出一大堆。rn 可在具体实现上!真不知道从哪入手。rn 请高手们指导一下小弟。最好是有源码,或者留下QQ.我QQ:304243104rn
C++实现UDP可靠传输
大家好,笨人最近在实现一个基于UDP的可靠传输的算法,参考的是TCP的实现机制,但是现在的问题就是,TCP是端对端的通信,而我想要实现一对多的通信,因此在发送和接收数据的时候,怎么设计发送缓冲和接收缓冲就是一个问题:下面是我初步的想法,希望大家给我宝贵的意见!谢谢rn[url=http://hi.csdn.net/space-8437142-do-album-picid-666285.html][/url]