UDP 实现可靠文件传输大家都清楚,如果用 TCP 传输文件的话,是很简单的,根本都不用操心会丢包,除非是网络坏了,就得重来。用 UDP 的话,因为 UDP 是不可靠的,所以用它传输文件,要保证不丢包,就得我们自己写额外的代码来保障了。本文就说说如何保证可靠传输。要实现无差错的传输数据, 我们可以采用重发请求( ARQ ) 协议, 它又可分为连续 AR Q 协议、选择重发 ARQ 协议、滑动窗口协议。本文重点介绍滑动窗口协议, 其它的两种有兴趣的可参考相关的网络通信之类的书。采用滑动窗口协议, 限制已发送出去但未被确认的数据帧的数目。循环重复使用已收到的那些数据帧的序号。具体实现是在发送端和接收端分别设定发送窗口和接收窗口。(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(); // 若不能整除,则应加 1 if(m_dwFileSize % sizeof() != 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 = ((char*)(), sizeof(sendbuf)); ::LeaveCriticalSection(&m_csQueue); // 退出 m_bufq
UDP实现可靠文件传输 来自淘豆网m.daumloan.com转载请标明出处.